DFS 记忆化搜索要点:
1.确定好返回值代表含义
2.记忆化数组 初始化
3.记忆化数组赋值的来源 return 别忘了赋值。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long LL ;
using namespace std;
const int N = 110;
typedef pair<int ,int > PII;
int k;
char g[N][N];
int n,a,b,aa,bb;
int f[N][N];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int p[N][N];
int dfs(int x,int y){
if(p[x][y] != -1) return p[x][y];
if( x==aa && y == bb){
p[x][y] = 1;
return 1;
}
for(int i=0;i<4;i++){
int t = x + dx[i];
int tt = y + dy[i];
if( t >= 0 && t < n && tt >=0 && tt < n && g[t][tt]=='.' ){
if(!f[t][tt]){
f[t][tt] = 1;
if(dfs(t,tt)) return p[x][y] = 1;
f[t][tt] = 0;
}
}
}
return p[x][y] = 0;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> k;
while(k--){
cin >> n;
memset(p,-1,sizeof p);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cin >> g[i][j];
}
cin >> a >> b >> aa >> bb;
if(g[a][b]=='#' || g[aa][bb]=='#') {
cout << "NO\n";
continue;
}else if(a==aa && b==bb) {
cout << "YES\n";
continue;
}
memset(f,0,sizeof f);
if(dfs(a,b)) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}