2023春季伴学挑战赛06C++算法:T1 运动达人

  • 题目ID: T0079
  • 题目名称: 走迷宫
  • 创建者: 爱思创
  • 时间限制: 1000 MS
  • 内存限制: 256 MB

走迷宫

题目描述

有一个 n∗m 的迷宫。迷宫中的入口在 (1,1)(1,1) 位置,出口藏于迷宫的内部,用 S 表示,现给出迷宫的地图。包含出口 S 、障碍物 #​ 、陷阱@和可以行走的空地.。已知每次移动只能移动到其所在位置的上下左右中的任意一个位置。请帮忙判断是否能从入口到达出口?

题中保证 (1,1)(1,1) 点为空地。

输入格式

第一行为两个正整数 n,m。

接下来 x 行,每行 y 个整数,由 S # @ .组成的迷宫地图

输出格式

能到达出口输出YES

不能到达出口输出NO

样例 #1

样例输入 #1

4 5
.....
.....
..S..
.....

样例输出 #1

YES

样例输入 #2

5 5
.....
..#..
.#S#.
..@..
.....

样例输出 #2

NO

提示

对于 100%100% 的数据,1≤n,m≤10。

保证 (1,1)(1,1) 点为空地

#include 
using namespace std;
char a[210][210];
bool vis[210][210];
int p[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int n,m,ans,sx,sy;
void dfs(int x,int y)
{
	int kx,ky;
	if(a[x][y]=='S')
	{
		ans++;
		return ; 
	}
	for(int i=0;i<=3;i++)
	{
		kx=x+p[i][0];
		ky=y+p[i][1];
		if(kx<1 || kx>n || ky<1 || ky>m)
		{
			continue;
		}
		if((a[kx][ky]=='.' || a[kx][ky]=='S') && vis[kx][ky]==false)
		{
			vis[kx][ky]=true;
			dfs(kx,ky);
			//vis[kx][ky]=false;
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
		}
	}
	vis[1][1]=true;
	dfs(1,1);
	if(ans)
	{
		cout<<"YES"<

你可能感兴趣的:(编程,算法,c++,图论)