逃离迷宫
有一个n * m大小的迷宫。其中字符\(S\)表示起点,字符\(D\)表示出口,字符\(X\)表示墙壁,字符 \(.\) 表示平地。你需要从\(S\)走到\(D\),每次只能向上下左右相邻的位置移动,并且不能走出地图,也不能走进墙壁。
若每次移动消耗1时间,走过路都会塌陷,因此不能走回头路或原地不动。现在已知出口的大门会在T时间打开,判断在0时间从起点出发能否逃离迷宫。
数据范围n<=20, m <= 50, T <= 1000
输入
第一行3个数n,m,T
接下来是n*m的矩阵
输出
若能逃离输出YES,否则输出NO
样例输入
4 4 5
S.X.
..X.
..XD
....
样例输出
NO
easy!!!
代码:
#include <bits/stdc++.h>
using namespace std;
int dx[5]={0,-1,0,1,0},dy[5]={0,0,1,0,-1};
int n,m,T;
char a[60][60];
int sx,sy,ex,ey;
bool flag,b[60][60];
struct lj{
int x,y;
}c[3600];
void dfs(int x,int y,int step)
{
if(x==ex&&y==ey)
{
cout << "YES";
exit(0);//终止程序
}
if(step>T) return;
for(int i=1;i<=4;i++)
{
int xx,yy;
xx=x+dx[i];
yy=y+dy[i];
if(xx>0&&xx<=n&&yy>0&&yy<=m&&!b[xx][yy]&&a[xx][yy]!='X')
{
b[xx][yy]=1;
c[step].x=xx;
c[step].y=yy;
dfs(xx,yy,step+1);
b[xx][yy]=0;
}
}
}
int main()
{
cin >> n >> m >> T;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin >> a[i][j];
if(a[i][j]=='S')
{
sx=i;
sy=j;
}
if(a[i][j]=='D')
{
ex=i;
ey=j;
}
}
}
b[sx][sy]=1;
dfs(sx,sy,0);
if(!flag) cout << "NO";
return 0;
}
本文来自小默的博客,转载请注明原文链接:https://www.cnblogs.com/momotrace/p/go-migong-away.html