牛客---走出迷宫 dfs 模板题(C/C++)

题目链接:

https://ac.nowcoder.com/login?callBack=%2Facm%2Fproblem%2F14572%3F%26headNav%3Dacm

题目描述

小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个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

输入:

( !!!注意:三个###号我输上不显示,说以我就拿的图片 )

输出:

Yes
No

#include<bits/stdc++.h>//万能开头
using namespace std;
const int N=510;
char g[N][N];//定义全局,在dfs里面也可以用 
int d[N][N];
int n,m,t;//全局变量,在dfs里也可用 
void dfs(int sx,int sy){
	if(g[sx][sy]=='E') t=1;//标记是否走到出口 
	int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};//坐标的偏移量 
	for(int i=0;i<4;i++){
		int x=sx+dx[i],y=sy+dy[i];//通过加上坐标偏移量实现坐标上下左右移动 
		if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]!='#'&&!d[x][y]){//前四个是判断当前位置是否出界,第五个是判断所在位置是否为通路,最后判断是否走过 
			d[x][y]=1;//标记当前位置走过了 
			dfs(x,y);//dfs下一个位置 
		}
	}
}
int main(){
	while(cin>>n>>m){//多实例输入 
		int sx=0,sy=0;
		t=0;
		memset(g,0,sizeof(g));//初始化 
		memset(d,0,sizeof(d));//初始化 
		for(int i=0;i<n;i++){	//输入 
			for(int j=0;j<m;j++){
				cin>>g[i][j];
				if(g[i][j]=='S'){//标记出口的位置 
					sx=i;sy=j;
				}
			}
		}
		dfs(sx,sy);//从起点开始遍历 
		if(t) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值