这题我先用 dfs 过了,照着 dfs 的代码改成 bfs ,WA了。
dfs 代码:(思路和题解都差不多)
#include<bits/stdc++.h>
using namespace std;
int dx[]= {0,0,1,-1};
int dy[]= {1,-1,0,0};
int r,c;
int vis[110][110][4][16];
char s[110][110];
bool dfs(int x,int y,int fx,int num) {
x=(x+r)%r,y=(y+c)%c;
if(vis[x][y][fx][num]) return 0;
vis[x][y][fx][num]=1;
fx=(s[x][y]=='^'?3:(s[x][y]=='>'?0:(s[x][y]=='v'?2:(s[x][y]=='<'?1:fx))));
if(s[x][y]=='_') fx=(num==0?0:1);
if(s[x][y]=='|') fx=(num==0?2:3);
if(s[x][y]=='?') {
for(int i=0; i<4; i++) {
if(dfs(x+dx[i],y+dy[i],i,num)) return 1;
}
return 0;
}
if(s[x][y]=='@') {
return 1;
}
if(s[x][y]>='0' && s[x][y]<='9') num=s[x][y]-'0';
if(s[x][y]=='+') num=(num+1)%16;
if(s[x][y]=='-') num=(num+15)%16;
return dfs(x+dx[fx],y+dy[fx],fx,num);
}
int main() {
scanf("%d%d",&r,&c);
for(int i=0; i<r; i++) scanf("%s",s[i]);
cout<<(dfs(0,0,0,0)?"YES\n":"NO\n");
return 0;
}
bfs 代码:
#include<bits/stdc++.h>
using namespace std;
int dx[]= {0,0,1,-1};
int dy[]= {1,-1,0,0};
int r,c;
int vis[110][110][4][16];
char s[110][110];
struct Q {
int x,y,fx,num;
} tmp;
queue<Q> q;
bool bfs() {
tmp.x=0,tmp.y=0,tmp.fx=0,tmp.num=0;
q.push(tmp);
while(!q.empty()) {
// cout<<q.front().x<<' '<<q.front().y<<' '<<q.front().fx<<' '<<q.front().num<<endl;
tmp.x=(q.front().x+r)%r,tmp.y=(q.front().y+c)%c;
if(vis[tmp.x][tmp.y][q.front().fx][q.front().num]) {
q.pop();
continue;
}
vis[tmp.x][tmp.y][q.front().fx][q.front().num]=1;
tmp.fx=(s[tmp.x][tmp.y]=='^'?3:(s[tmp.x][tmp.y]=='>'?0:(s[tmp.x][tmp.y]=='v'?2:(s[tmp.x][tmp.y]=='<'?1:q.front().fx))));
if(s[tmp.x][tmp.y]=='_') tmp.fx=(q.front().num==0?0:1);
if(s[tmp.x][tmp.y]=='|') tmp.fx=(q.front().num==0?2:3);
if(s[tmp.x][tmp.y]=='?') {
for(int i=0; i<4; i++) {
tmp.x=tmp.x+dx[i],tmp.y=tmp.y+dy[i],tmp.fx=i,tmp.num=q.front().num;
q.push(tmp);
}
q.pop();
continue;
}
if(s[tmp.x][tmp.y]=='@') {
return 1;
}
if(s[tmp.x][tmp.y]>='0' && s[tmp.x][tmp.y]<='9') tmp.num=s[tmp.x][tmp.y]-'0';
if(s[tmp.x][tmp.y]=='+') tmp.num=(q.front().num+1)%16;
if(s[tmp.x][tmp.y]=='-') tmp.num=(q.front().num+15)%16;
tmp.x+=dx[tmp.fx],tmp.y+=dy[tmp.fx];
q.push(tmp);
q.pop();
}
return 0;
}
int main() {
scanf("%d%d",&r,&c);
for(int i=0; i<r; i++) scanf("%s",s[i]);
cout<<(bfs()?"YES\n":"NO\n");
return 0;
}
望大佬调,找出 bug 可以获得我的一个微小的关注!