AcWing 1112. 迷宫 C++ dfs 暴力
原题链接
简单
作者:
忧郁的派大星
,
2021-03-27 14:35:51
,
所有人可见
,
阅读 390
- 直接从开始点往四周上下左右走,走过的点变为墙,看能不能走到终点。走到终点标记一下。
dfs跳出条件
#include <bits/stdc++.h>
using namespace std;
char a[101][101];
int n; //临时二维数组大小
int starx,stary,endx,endy; //起始点和终点的xy坐标
void dfs(int x,int y);
int main()
{
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
memset(a,'N',sizeof(a));
//输入部分——————————————————————————————————————star
scanf("%d",&n);
getchar(); //消除空格
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
scanf("%c",&a[j][k]);
getchar(); //消除空格
}
scanf("%d%d%d%d",&starx,&stary,&endx,&endy);
//输入部分——————————————————————————————————————end
//输出测试
// for(int j=0;j<n;j++)
// {
// for(int k=0;k<n;k++)
// printf("%c",a[j][k]);
// puts("");
// }
if(a[starx][stary]=='#'||a[endx][endy]=='#') printf("NO\n"); //开始点和终点是墙的情况
else{
dfs(starx,stary);
if(a[endx][endy]=='Y') printf("YES\n"); //判断终点是不是Y;
else printf("NO\n");
}
}
return 0;
}
void dfs(int x,int y)
{
if(x==endx&&y==endy) //成功时,标记
{
a[x][y]='Y'; //标记终点为Y,
return;
}
if(x<0||y<0||a[x][y]=='N') return; //超出边界
if(a[x][y]=='#') return; //遇到墙时结束
a[x][y]='#'; //走过的点变为墙
dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);
}