萌新求助 bfs,WA on #30
查看原帖
萌新求助 bfs,WA on #30
353688
王熙文楼主2021/3/15 19:55

这题我先用 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 可以获得我的一个微小的关注!

2021/3/15 19:55
加载中...