1014 wyh的迷宫 dfs

 

链接:https://ac.nowcoder.com/acm/contest/23156/1014
来源:牛客网

题目描述

给你一个n*m的迷宫,这个迷宫中有以下几个标识:

s代表起点

t代表终点

x代表障碍物

.代表空地

现在你们涵哥想知道能不能从起点走到终点不碰到障碍物(只能上下左右进行移动,并且不能移动到已经移动过的点)。

输入描述:

输入第一行一个整数T(1<=T<=10)
接下来有T组测试数据,对于每一组测试数据,第一行输入2个数n和m(1<=n,m<=500)
接下来n行,每行m个字符代表这个迷宫,每个字符都是上面4个中的一种
数据保证只有一个起点和一个终点

输出描述:

对于每一组测试数据,如果可以的话输出YES,不可以的话输出NO
示例1

输入

复制
1
3 5
s...x
x...x
...tx

输出

复制
YES


分析

 只是要看看能不能走到,vis就不用回溯,直接一条路走到黑就可以

 

//-------------------------代码----------------------------

//#define int LL
const int N = 510;
int n,m;
int mp[N][N];
int vis[N][N];
int ed,st;
bool ok = false;
void dfs(int u) {
    int x = u / m,y = u % m;
    if(u == st) {
//         dbb(u,x,y);
    }
    if(u == ed || ok) {
        ok = true;rt;
    }
    for(int i = 0;i<4;i++) {
        int xx = x + dx[i],yy = y + dy[i];
        if(xx < 1 || yy < 1 || xx > n || yy > m) continue;
        if(mp[xx][yy] || vis[xx][yy]) continue;
        vis[xx][yy] = true;
        dfs(xx * m + yy);
    }
}

void solve()
{
    memset(mp,0,sizeof mp);
    memset(vis,0,sizeof vis);
    ok = false;
    cin>>n>>m;
    fo(i,1,n) {
        fo(j,1,m) {
            char s;cin>>s;
            if(s == 'x') mp[i][j] = 1;
            else if(s == 't') ed = i * m + j;
            else if(s == 's') st = i * m + j;
        }
    }
//     cout<<st<<ed<<endl;
    dfs(st);
    if(ok){YES;}
    else NO;
}

signed main(){
    #if DEBUG == 1
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    #endif
    TLE;
    int t;cin>>t;while(t -- )
    solve();
//    {solve(); }
    return 0;
}

//------------------------------------------------------------

 

易错点:

用i * m + j 这样来表示一个点的时候,要注意 * m 而不是 * n。。。

 

posted @ 2022-06-30 19:57  er007  阅读(23)  评论(0编辑  收藏  举报