st[N][N]用来记录迷宫i,j位置是否走过
开始想宽搜,后来想宽搜是为了找最短路,深搜是一直搜下去直到有解,本题只需要有解就可以
#include<iostream>
#include <cstring>
using namespace std;
int k,n;
const int N = 110;
string str[N];
bool st[N][N];
int la,lb,ha,hb;
bool dfs();
int main(){
cin>>k;
while(k--){
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
st[i][j] = false;
scanf("%d",&n);
for(int i = 0;i<n;i++){
cin>>str[i];
}
scanf("%d%d%d%d",&ha,&la,&hb,&lb);
st[ha][la] = true;
if(dfs()){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
bool dfs(){
if(str[ha][la] != '.') return false;
if(la == lb && ha == hb) return true;
if(ha - 1 >= 0 && str[ha-1][la] == '.' && !st[ha-1][la]) {
ha--;
st[ha][la] = true;
if(dfs()) return true;
st[ha][la] = false;
ha++;
}
if(ha + 1 <= n-1 && str[ha+1][la] == '.' && !st[ha+1][la]) {
ha++;
st[ha][la] = true;
if(dfs()) return true;
st[ha][la] = false;
ha--;
}
if(la + 1 <= n-1 && str[ha][la+1] == '.' && !st[ha][la+1]) {
la++;
st[ha][la] = true;
if(dfs()) return true;
st[ha][la] = false;
la--;
}
if(la - 1 >= 0 && str[ha][la-1] == '.' && !st[ha][la-1]) {
la--;
st[ha][la] = true;
if(dfs()) return true;
st[ha][la] = true;
la++;
}
return false;
}