题解说是 BFS,但我的 BFS 如果不加卡时就会死循环,加了就 WA。
是我那里写错了吗?
WA 56 pts 代码:
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
const int N=60; char c[N][N]; int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};
struct Node { int x,y,s; };
void solve() {
int h,w,a,xa,ya,b,xb,yb,cnt=0; bool flag=false; scanf("%d %d %d %d %d %d %d %d",&h,&w,&a,&xa,&ya,&b,&xb,&yb);
for(int i=1;i<=h;i++) for(int j=1;j<=w;j++) scanf(" %c",&c[i][j]);
if(abs(b-a)%2!=(abs(xa-xb)+abs(ya-yb))%2) return puts("No"),void();
queue<Node>q; q.push((Node){xa,ya,a});
while(!q.empty()) {
Node p=q.front(); q.pop();
if(!p.s) continue;
if(p.x==xb&&p.y==yb&&p.s==b) { flag=true; break; }
cnt++;
if(cnt>7e6) break;
for(int i=1;i<=4;i++) {
int xx=p.x+dx[i],yy=p.y+dy[i];
if(xx>=1&&xx<=h&&yy>=1&&yy<=w) q.push((Node){xx,yy,p.s+(c[xx][yy]=='*'?1:-1)});
}
}
puts(flag?"Yes":"No");
}
int main() {
freopen("snowball.in","r",stdin),freopen("snowball.out","w",stdout);
int t; scanf("%d",&t);
while(t--) solve();
return 0;
}