莫欺少年穷,修魔之旅在这开始—>算法提高课题解
保姆级注释,看不懂你炸我
思路:
1. 注意:多组数据,st 需要初始化
2. 如果该点是 '#',则直接 return false
3. 记录该点,枚举该点的四个方向,符合条件的继续 dfs
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n;
int ha,la,hb,lb;
char g[N][N];
bool st[N][N];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
bool dfs(int x,int y)
{
//直接过滤(包括起点)
if(g[x][y]=='#') return false;
//到达终点
if(x==hb&&y==lb) return true;
//记录该点
st[x][y]=true;
//枚举四个方向能够到达的点
for(int i=0;i<4;i++)
{
int a=x+dx[i],b=y+dy[i];
//超出边界
if(a<0||a>=n||b<0||b>=n) continue;
//该点之前出现过
if(st[a][b]) continue;
if(dfs(a,b)) return true;
}
return false;
}
int main()
{
int T;
cin>>T;
while(T--)
{
//多组数据,st需要初始化
memset(st,0,sizeof st);
cin>>n;
for(int i=0;i<n;i++) cin>>g[i];
cin>>ha>>la>>hb>>lb;
cout<<(dfs(ha,la)?"YES":"NO")<<endl;
}
return 0;
}