花花生米

导航

走出迷宫

这道题的存在有点很搞笑哟,好像几个月都没写过题了,所以拿这道题来练哈手,找点子感觉,嘻嘻嘻。
总体来说:

  • 这道题就是一个套用深搜模板滴题,不过与以往的深搜模板题不同的是,这是一个多组数据的输入,所以会有几个注意点。

题目:链接: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\n" : "No\n");
	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();
	}
}

posted on 2021-02-01 14:47  花花生米  阅读(164)  评论(0编辑  收藏  举报