用bfs写的。
- 看了一下题解,目前没有看到C++用bfs来做的,这里作为一个补充。
- 刚开始的时候,队列q开小了,导致几个点过不去!天哪。所以,一定要细心,下面的bfs是ac的。
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 110, M = N * N;
PII q[M]; // 注意队列不要开小了
char g[N][N];
bool st[N][N];
int n;
bool bfs(int sx, int sy, int tx, int ty){
if(g[sx][sy] == '#' || g[tx][ty] == '#') return false;
if( sx == tx && sy == ty) return true;
memset(st, 0, sizeof st);
int dx[4] = { -1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int hh = 0, tt =0;
q[0] = {sx, sy};
st[sx][sy] = true;
while( hh <= tt){
PII t = q[ hh ++];
for(int i = 0; i< 4; i ++){
int a = t.x + dx[i], b = t.y + dy[i];
if( a < 0 || a >=n || b < 0 || b >= n || st[a][b] || g[a][b] == '#') continue;
if( a == tx && b == ty) return true;
st[a][b] = true;
q[++ tt] = {a, b};
}
}
return false;
}
int main(){
int T;
cin >> T;
while(T--){
cin >> n;
for(int i = 0; i < n; i ++) cin >> g[i];
int sx,sy, tx,ty;
cin >> sx >> sy >> tx >> ty;
if(bfs(sx,sy, tx, ty)) cout << "YES" << endl;
else cout << "NO" << endl;
}
}