1 条题解

  • 0
    @ 2024-5-17 19:48:39

    思路

    深搜模板题。我们需要判断如下情况:

    1. 坐标超出边界;
    2. 该点已被遍历过;
    3. 该点上有障碍;

    以上情况均需返回。如果该点为目标点,则将答案计数器加一并返回。

    如果以上情况均不成立,我们就标记为该点被遍历过,然后向四个方向递归,然后再回溯。

    AC Code

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll N=10,M=15;
    ll n,m,t,sx,sy,fx,fy,ans;
    struct node{
        ll x,y;
    }a[M];
    bool flag[N][N];
    void dfs(ll x,ll y){
        if(x<1||y<1||x>n||y>m||flag[x][y]) // 超出边界或被遍历过
            return;
        for(ll i=1;i<=t;i++)
            if(x==a[i].x&&y==a[i].y)
                return; // 该点上有障碍
        if(x==fx&&y==fy){ // 该点为目标点
            ans++;  
            return;
        }
        flag[x][y]=1; // 记忆化
        dfs(x+1,y),dfs(x-1,y),dfs(x,y+1),dfs(x,y-1);
        flag[x][y]=0; // 回溯
    }
    int main(){
        scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&m,&t,&sx,&sy,&fx,&fy);
        for(ll i=1;i<=t;i++)
            scanf("%lld%lld",&a[i].x,&a[i].y);
        dfs(sx,sy);
        printf("%lld",ans);
        return 0;
    }
    
    
    • 1

    信息

    ID
    745
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    85
    已通过
    48
    上传者