求助
查看原帖
求助
490484
include13_fAKe楼主2024/4/24 22:11
#include<bits/stdc++.h>
using namespace std;

queue<int> q;
string s;
string s1=" 123804765";
int now[5][5];
int now1[12];
int now_[12];
int ans[500005];
bool app[13];
int fact[13];
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
void init(){
	now[1][1]=s[1]-'0'+1;
	now[1][2]=s[2]-'0'+1;
	now[1][3]=s[3]-'0'+1;
	now[2][1]=s[4]-'0'+1;
	now[2][2]=s[5]-'0'+1;
	now[2][3]=s[6]-'0'+1;
	now[3][1]=s[7]-'0'+1;
	now[3][2]=s[8]-'0'+1;
	now[3][3]=s[9]-'0'+1;
	return;
}
void fact_init(){
	fact[0]=1;
	for(int i=1;i<=10;i++){
		fact[i]=fact[i-1]*i;
	}
	return;
}
void now1_init(){
	now1[1]=now[1][1];
	now1[2]=now[1][2];
	now1[3]=now[1][3];
	now1[4]=now[2][1];
	now1[5]=now[2][2];
	now1[6]=now[2][3];
	now1[7]=now[3][1];
	now1[8]=now[3][2];
	now1[9]=now[3][3];
	return;
}
int conto(){
	memset(app,false,sizeof(app));
	for(int i=1;i<=9;i++){
		now_[i]=now1[i];
	}
	int ret=1;
	for(int i=1;i<=8;i++){
		int now2=0;
		for(int j=now_[i]-1;j>=1;j--){
			now2+=(!app[j]);
		}
		ret=ret+fact[9-i]*now2;
		app[now_[i]]=true;
	}
	return ret;
}
void conto1(int now3){
	memset(app,false,sizeof(app));
	for(int i=1;i<=9;i++){
		int now2=now3/fact[9-i];
//		cout<<now2<<endl;
		int j=0,sum=0;
		while(sum<=now2){
            j++;
			sum+=(!app[j]);
		}
		now3-=now2*fact[9-i];
		int l=i/3;
		int c=i%3;
		if(i%3)	l++;
		if(!c)	c=3;
		now[l][c]=j;
//		cout<<l<<' '<<c<<' '<<j<<endl;
		app[j]=true;
	}
	now1_init();
	return;
}
int find0(){
	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			if(now[i][j]==1){
				return (i-1)*3+(j-1)+1;
			}
		}
	}
	return -1;
}
bool check(int x,int y){
	return x>=1&&x<=3&&y>=1&&y<=3;
}
void Astar(){
	int dir=0;
	now1_init();
	int fir=conto();
	ans[fir]=0;
	q.push(fir);
	while(!q.empty()){
		int now2=q.front();
		q.pop();
		conto1(now2-1);
//		for(int i=1;i<=3;i++){
//			for(int j=1;j<=3;j++){
//				cout<<now[i][j]<<' ';
//			}
//			cout<<endl;
//		}
//		cout<<endl;
		int _0=find0();
		dir++;
		int x=_0/3+1;
		int y=_0%3;
		if(!y)	y=3;
		for(int i=0;i<4;i++){
			int tx=x+dx[i];
			int ty=y+dy[i];
			if(check(tx,ty)){
				swap(now[x][y],now[tx][ty]);
				now1_init();
				int new_=conto();
				if(ans[new_]>=1e8){
					ans[new_]=ans[now2]+1;
					q.push(new_);
				}
				swap(now[x][y],now[tx][ty]);
			}
		}
	}
//	cout<<dir<<endl;
	return;
}
int main(){
	memset(ans,0x3f,sizeof(ans));
	cin>>s;
	s=' '+s;
	init();
	fact_init();
	now1_init();
	s=s1;
	Astar();
    init();
	now1_init();
	cout<<ans[conto()]<<endl;
	return 0;
}
2024/4/24 22:11
加载中...