走出迷宫 dfs

链接:登录—专业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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值