九十分代码,求改,码风简朴无华,双向BFS
查看原帖
九十分代码,求改,码风简朴无华,双向BFS
1285529
wangziyujiayou楼主2024/3/23 15:05
#include<bits/stdc++.h>
using namespace std;
int t,x,y;
int dx[8]={-2,-2,-1,1,-1,1,2,2};
int dy[8]={-1,1,2, 2,-2,-2,-1,1};
string ditu={"111110111100*110000100000"};
char mp[15][15];
void zh1(string ss){
	for(int i=0;i<ss.size();i++){
		mp[i/5][i%5]=ss[i];
		if(ss[i]=='*'){
			x=i/5;
			y=i%5;
		}
	}
}
string zh2(){
	string s3;
	for(int i=0;i<5;i++){
		for(int j=0;j<5;j++){
			s3=s3+mp[i][j];
		}
	}
	return s3;
}
int main(){
	scanf("%d",&t);
	for(int l=1;l<=t;l++){
		string s,s1;
		int ans=2147483647;
		map<string,int> m;
		map<string,int> n;
		for(int i=1;i<=5;i++){
			cin>>s1;
			s=s+s1;
		}
		if(s==ditu){
			printf("0\n");
			continue;
		}
		queue<string> q;
		queue<string> p;
		q.push(s);
		p.push(ditu);
		m[s]=1;
		n[s]=1;
		while(!q.empty()){
			string s4=q.front();
			q.pop();
			if(m[s4]>=8){
				break;
			}
			if(s4==ditu){
				break;
			}
			zh1(s4);
			for(int i=0;i<8;i++){
				int xx=x+dx[i];
				int yy=y+dy[i];
				if(xx<0||xx>4||yy<0||yy>4)continue;
				swap(mp[xx][yy],mp[x][y]);
				string s2=zh2();
				swap(mp[xx][yy],mp[x][y]);
				if(m[s2]!=0)continue;
				m[s2]=m[s4]+1;
				q.push(s2);
			}
		}
		while(!p.empty()){
			string s5=p.front();
			p.pop();
			if(n[s5]>=9){
				break;
			}
			if(s5==s){
				break;
			}
			if(m[s5]!=0&&n[s5]!=0){
				ans=min(ans,m[s5]+n[s5]);
			}
			zh1(s5);
			for(int i=0;i<8;i++){
				int xxx=x+dx[i];
				int yyy=y+dy[i];
				if(xxx<0||xxx>4||yyy<0||yyy>4)continue;
				swap(mp[xxx][yyy],mp[x][y]);
				string s6=zh2();
				swap(mp[xxx][yyy],mp[x][y]);
				if(n[s6]!=0)continue;
				n[s6]=n[s5]+1;
				p.push(s6);
			}
		}
        if(ans>=17){
			printf("-1\n");
		}
		else{
			printf("%d\n",ans-1);
		}
	}
    return 0;
}
2024/3/23 15:05
加载中...