50pts SPFA 求助
查看原帖
50pts SPFA 求助
598875
nikodo楼主2024/1/15 13:58

过长的代码:

#include<bits/stdc++.h>
using namespace std;
int n;
char c[105][105];
int dis[105][105];
int c1,r1,c2,r2;
int ans=1e9;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
bool f(int u,int v){
	return u>0&&u<=n&&v>0&&v<=n&&c[u][v]!='x';
}
int main(){
	for(int i=0;i<105;i++)
		for(int j=0;j<105;j++)
			dis[i][j]=1e9;
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			cin>>c[i][j];
			if(c[i][j]=='A')c1=i,r1=j;
			else if(c[i][j]=='B')c2=i,r2=j;
		}
	queue<int> qx,qy,qz;
	qx.push(c1);
	qy.push(r1);
	qz.push(0);
	dis[c1][r1]=0;
	while(!qx.empty()){
		int nowx=qx.front(),nowy=qy.front(),nowz=qz.front();qx.pop();qy.pop();qz.pop();
		if(nowx==c2&&nowy==r2){
			if(ans>dis[nowx][nowy])
			ans=dis[nowx][nowy];
		}
		else if(c[nowx][nowy]=='x'||dis[nowx][nowy]>=ans)continue;
		else if(nowz==0)
			for(int i=0;i<4;i++){
				if(!f(nowx+dx[i],nowy+dy[i]))continue;
				qx.push(nowx+dx[i]);
				qy.push(nowy+dy[i]);
				qz.push(i+1);
				dis[nowx+dx[i]][nowy+dy[i]]=0;
			}
		else if(nowz==1){
			if(f(nowx+dx[0],nowy+dy[0])&&dis[nowx][nowy]<dis[nowx+dx[0]][nowy+dy[0]]){
				dis[nowx+dx[0]][nowy+dy[0]]=dis[nowx][nowy];
					qx.push(nowx+dx[0]);
					qy.push(nowy+dy[0]);
					qz.push(1);
			}
			if(f(nowx+dx[1],nowy+dy[1])&&dis[nowx][nowy]+1<dis[nowx+dx[1]][nowy+dy[1]]){
				dis[nowx+dx[1]][nowy+dy[1]]=dis[nowx][nowy]+1;
					qx.push(nowx+dx[1]);
					qy.push(nowy+dy[1]);
					qz.push(2);
			}
			if(f(nowx+dx[3],nowy+dy[3])&&dis[nowx][nowy]+1<dis[nowx+dx[3]][nowy+dy[3]]){
				dis[nowx+dx[3]][nowy+dy[3]]=dis[nowx][nowy]+1;
					qx.push(nowx+dx[3]);
					qy.push(nowy+dy[3]);
					qz.push(4);
			}
		}else if(nowz==2){			
			if(f(nowx+dx[0],nowy+dy[0])&&dis[nowx][nowy]+1<dis[nowx+dx[0]][nowy+dy[0]]){
				dis[nowx+dx[0]][nowy+dy[0]]=dis[nowx][nowy]+1;
					qx.push(nowx+dx[0]);
					qy.push(nowy+dy[0]);
					qz.push(1);
			}
			if(f(nowx+dx[1],nowy+dy[1])&&dis[nowx][nowy]<dis[nowx+dx[1]][nowy+dy[1]]){
				dis[nowx+dx[1]][nowy+dy[1]]=dis[nowx][nowy];
					qx.push(nowx+dx[1]);
					qy.push(nowy+dy[1]);
					qz.push(2);
			}
			if(f(nowx+dx[2],nowy+dy[2])&&dis[nowx][nowy]+1<dis[nowx+dx[2]][nowy+dy[2]]){
				dis[nowx+dx[2]][nowy+dy[2]]=dis[nowx][nowy]+1;
					qx.push(nowx+dx[2]);
					qy.push(nowy+dy[2]);
					qz.push(3);
			}
		}else if(nowz==3){
			if(f(nowx+dx[1],nowy+dy[1])&&dis[nowx][nowy]+1<dis[nowx+dx[1]][nowy+dy[1]]){
				dis[nowx+dx[1]][nowy+dy[1]]=dis[nowx][nowy]+1;
					qx.push(nowx+dx[1]);
					qy.push(nowy+dy[1]);
					qz.push(2);
			}
			if(f(nowx+dx[2],nowy+dy[2])&&dis[nowx][nowy]<dis[nowx+dx[2]][nowy+dy[2]]){
				dis[nowx+dx[2]][nowy+dy[2]]=dis[nowx][nowy];				
					qx.push(nowx+dx[2]);
					qy.push(nowy+dy[2]);
					qz.push(3);
			}
			if(f(nowx+dx[3],nowy+dy[3])&&dis[nowx][nowy]+1<dis[nowx+dx[3]][nowy+dy[3]]){
				dis[nowx+dx[3]][nowy+dy[3]]=dis[nowx][nowy]+1;
					qx.push(nowx+dx[3]);
					qy.push(nowy+dy[3]);
					qz.push(4);
			}
		}else if(nowz==4){
			if(f(nowx+dx[0],nowy+dy[0])&&dis[nowx][nowy]+1<dis[nowx+dx[0]][nowy+dy[0]]){
				dis[nowx+dx[0]][nowy+dy[0]]=dis[nowx][nowy]+1;
					qx.push(nowx+dx[0]);
					qy.push(nowy+dy[0]);
					qz.push(1);
			}
			if(f(nowx+dx[2],nowy+dy[2])&&dis[nowx][nowy]+1<dis[nowx+dx[2]][nowy+dy[2]]){
				dis[nowx+dx[2]][nowy+dy[2]]=dis[nowx][nowy]+1;
					qx.push(nowx+dx[2]);
					qy.push(nowy+dy[2]);
					qz.push(3);
			}
			if(f(nowx+dx[3],nowy+dy[3])&&dis[nowx][nowy]<dis[nowx+dx[3]][nowy+dy[3]]){
				dis[nowx+dx[3]][nowy+dy[3]]=dis[nowx][nowy];
					qx.push(nowx+dx[3]);
					qy.push(nowy+dy[3]);
					qz.push(4);
			}
		}
	}
	if(ans==1e9)ans=-1;
	cout<<ans;
	return 0;
}
2024/1/15 13:58
加载中...