逃离迷宫

发布时间 2023-04-11 19:59:12作者: Momo·Trace

有一个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;
}