社区讨论

01迷宫求调

P8628[蓝桥杯 2015 国 AC] 穿越雷区参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo26kt7l
此快照首次捕获于
2023/10/23 08:50
2 年前
此快照最后确认于
2023/11/03 09:05
2 年前
查看原帖
感觉是 bfs 里几个判断的问题,但是实在没找到问题出在哪,恳请大佬指点。
CPP
#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y,num,ans;
};node arr[110][110];
bool f[110][110];
queue <node> q;
const int w[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int main(){
	ios::sync_with_stdio(false);
	int n;
	cin>>n;
	int sx,sy,ex,ey;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			arr[i][j].ans=0;
			char c;
			cin>>c;
			arr[i][j].x=i,arr[i][j].y=j;
			if(c=='+')
				arr[i][j].num=1;
			else if(c=='-')
				arr[i][j].num=-1;
			else if(c=='A'){
				sx=i,sy=j;
				arr[i][j].num=-2;
			}
			else if(c=='B'){
				ex=i,ey=j;
				arr[i][j].num=-2;
			}
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			f[i][j]=0;
	q.push(arr[sx][sy]);
	f[sx][sy]=1;
	while(!q.empty()){
		int now_x=q.front().x,now_y=q.front().y,now_ans=q.front().ans,now_num=q.front().num;
		for(int k=0;k<=3;k++){
			int tx=now_x+w[k][0],ty=now_x+w[k][1];
			if(tx==ex&&ty==ey){
				cout<<now_ans+1<<"\n";
				return 0;
			}
			if(tx<1||ty<1||tx>n||ty>n)
				continue;
			if(f[tx][ty])
				continue;
			if(arr[tx][ty].num+now_num==2||arr[tx][ty].num+now_num==-2)
				continue;
			arr[tx][ty].ans=now_ans+1;
			q.push(arr[tx][ty]);
			f[tx][ty]=1;
		}
		q.pop();
	}
	cout<<-1<<"\n";
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...