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
分析
只是要看看能不能走到,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。。。