链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。
小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。
障碍物不能通过。小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1);
小明想要知道,现在他能否从起点走到终点。
输入描述:
本题包含多组数据。 每组数据先输入两个数字N,M 接下来N行,每行M个字符,表示地图的状态。 数据范围: 2<=N,M<=500 保证有一个起点S,同时保证有一个终点E.
输出描述:
每组数据输出一行,如果小明能够从起点走到终点,那么输出Yes,否则输出No
示例1
输入
3 3 S.. ..E ... 3 3 S## ### ##E
输出
Yes No
走迷宫的话就是要一直不断尝试,那么如何让计算机完成,就是深度优先搜索。
先确定好起点x,y的位置,然后让计算机不断去尝试没有尝试过的方向,如果这个位置是终点那么退出,如果是障碍物或者四个方向走完了那就返回上一个状态,也即是回溯,不断尝试,如果一直到最后退回起点都没有可以走了就可以结束了(实际上这个在程序里面体现的不是很明显)。
#include<stdio.h>
int n, m;
char a[510][510];
bool vis[510][510][5];
int xx[5] = { 0,-1,0,1,0 };
int yy[5] = { 0,0,1,0,-1 };//上右下左i+x,j+y
int flag;//标记能不能找到终点
void ini()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
for (int k = 1; k <= 4; k++)
vis[i][j][k] = 0;
return;
}
void dfs(int x, int y)
{
if(flag==1)return ;//已经找到答案了可以走了
if (a[x][y] == 'E')
{
flag = 1;
printf("Yes\n");
return;
}
if (a[x][y] == '#')
return;
for (int i = 1; i <= 4; i++)//枚举四个方向
{
if (x+xx[i]<=n&&x+xx[i]>=1&&y+yy[i]>=1&&y+yy[i]<=m&&!vis[x][y][i])
{
vis[x][y][i] = 1;//标记这个方向
dfs(x+xx[i] ,y+yy[i]);//下一步
}
}
return;
}
int main()
{
while (~scanf("%d%d", &n, &m))
{
ini();//对vis数组初始化
int x, y;//记录起点位置
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
scanf(" %c", &a[i][j]);//%c掐面放一个空格可以去掉一些不必要读入的东北
if (a[i][j] == 'S')x = i, y = j;
}
flag=0;
dfs(x, y);
if (!flag)printf("No\n");
}
return 0;
}