这道题的存在有点很搞笑哟,好像几个月都没写过题了,所以拿这道题来练哈手,找点子感觉,嘻嘻嘻。
总体来说:
- 这道题就是一个套用深搜模板滴题,不过与以往的深搜模板题不同的是,这是一个多组数据的输入,所以会有几个注意点。
题目:链接:https://ac.nowcoder.com/acm/problem/14572
来源:牛客网
小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。
小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。
障碍物不能通过。小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1);
小明想要知道,现在他能否从起点走到终点。
输入示例:
3 3
S..
..E
...
3 3
S##
###
##E
输出:
Yes
No
以下是运行成功的代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#define close_stdin ios::sync_with_stdio(false)
using namespace std;
void dfs(int zx, int zy);
static int n, m; static char map[510][510], c;
bool vis[510][510];
int sx[4] = { 0,0,1,-1 }, sy[4] = { 1,-1,0,0 };
int zx, zy, flag = 0;
void inmap(int n, int m)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> c; map[i][j] = c;
if (c == 'S') {
zx = i, zy = j;
}
}
}
}
void clean()//因为多组数据输入,所以这部分注意要清零
{
flag=0;//自己在这个地方卡到了,晓得之后就觉得自己真是个憨憨,一直盯着memset康了
memset(vis, 0, sizeof(vis));
dfs(zx, zy);
//cout << (flag ? "Yes
" : "No
");
if (flag == 1)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
bool inmap_(int i, int j)//判断是否在地图中,单独写出一部分,方便明了
{
return(i >= 1 && i <= n && j >= 1 && j <= m);
}
void dfs(int zx, int zy)
{
vis[zx][zy] = 1;
for (int i = 0; i < 4; i++) {
int nx = zx + sx[i];
int ny = zy + sy[i];
if (inmap_(nx, ny) && vis[nx][ny]!=1 && map[nx][ny] != '#')
{
if (map[nx][ny] == 'E')
{
flag = 1; return;
}
else dfs(nx, ny);
vis[zx][zy] = 0;
}
}
}
int main()
{
close_stdin;
while (cin >> n >> m)
{
inmap(n, m);
clean();
}
}