BFS 28分,求助大佬
查看原帖
BFS 28分,求助大佬
958061
F_Awarden楼主2023/3/5 11:28
#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans=-1,dx[8]={1,0,-1,0,1,1,-1,-1},dy[8]={0,1,0,-1,1,-1,1,-1};
int dis[501][501][2];
bool vis[501][501][2],mapp[501][501];
struct node{
	int x,y,dis;
	bool dir;
};
queue<node> q;
void bfs(){
	if(mapp[1][1]){
		mapp[1][1]^=1;
		q.push({1,1,1,mapp[1][1]});
		vis[1][1][mapp[1][1]]=1;
		dis[1][1][0]=1;
	}else{
		q.push({1,1,0,mapp[1][1]});
		vis[1][1][mapp[1][1]]=1;
	}
	while(!q.empty()){
		int x=q.front().x;
		int y=q.front().y;
		int diss=q.front().dis;
		bool dir=q.front().dir;
		q.pop();
		if(x==n&&y==m){
			ans=q.front().dis;
			return;
		}
		for(int i=0;i<8;i++){
			int tx=x+dx[i],ty=y+dy[i];
			if(tx<=0||tx>n||ty<=0||ty>m){
				continue;
			}
			if(!dx[i]||!dy[i]){
				if(mapp[tx][ty]==dir&&(!vis[tx][ty][dir^1]||dis[tx][ty][dir^1]>diss+1)){
					mapp[tx][ty]^=1;
					vis[tx][ty][mapp[tx][ty]]=1;
					q.push({tx,ty,diss+1,mapp[tx][ty]});
					dis[tx][ty][mapp[tx][ty]]=diss+1;
				}else if(mapp[tx][ty]!=dir&&(!vis[tx][ty][dir]||dis[tx][ty][dir]>diss)){
					vis[tx][ty][mapp[tx][ty]]=1;
					q.push({tx,ty,diss,mapp[tx][ty]});
					dis[tx][ty][mapp[tx][ty]]=diss;
				}
			}else{
				if(mapp[tx][ty]){
					if(dx[i]==1&&dy[i]==-1||dx[i]==-1&&dy[i]==1){
						if(mapp[tx][ty]!=dir&&(!vis[tx][ty][dir^1]||dis[tx][ty][dir^1]>diss+1)){
							mapp[tx][ty]^=1;
							vis[tx][ty][mapp[tx][ty]]=1;
							q.push({tx,ty,diss+1,mapp[tx][ty]});
							dis[tx][ty][mapp[tx][ty]]=diss+1;
						}else if(mapp[tx][ty]==dir&&(!vis[tx][ty][dir]||dis[tx][ty][dir]>diss+1)){
							vis[tx][ty][mapp[tx][ty]]=1;
							q.push({tx,ty,diss,mapp[tx][ty]});
							dis[tx][ty][mapp[tx][ty]]=diss;
						}
					}
				}else{
					if(dx[i]==-1&&dy[i]==-1||dx[i]==1&&dy[i]==1){
						if(mapp[tx][ty]!=dir&&(!vis[tx][ty][dir^1]||dis[tx][ty][dir^1]>diss+1)){
							mapp[tx][ty]^=1;
							vis[tx][ty][mapp[tx][ty]]=1;
							q.push({tx,ty,diss+1,mapp[tx][ty]});
							dis[tx][ty][mapp[tx][ty]]=diss+1;
						}else if(mapp[tx][ty]==dir&&(!vis[tx][ty][dir]||dis[tx][ty][dir]>diss+1)){
							vis[tx][ty][mapp[tx][ty]]=1;
							q.push({tx,ty,diss,mapp[tx][ty]});
							dis[tx][ty][mapp[tx][ty]]=diss;
						}
					}
				}
			}
		}
	}
}
int main(){
	cin >> n >> m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char pig;
			cin >> pig;
			if(pig=='/'){
				mapp[i][j]=1;
			}else{
				mapp[i][j]=0;
			}
		}
	}
	bfs();
	if(ans>=0){
		cout << ans << endl;
	}else{
		cout << "NO SOLUTION" << endl;
	}
	return 0;
}

会超时

2023/3/5 11:28
加载中...