就对25分。救救我!!!!!
查看原帖
就对25分。救救我!!!!!
615236
FF_pigeon楼主2022/9/24 15:37

我就想问,为什么不对。

我就想问了,为什么不对

#include <cstdio>
#include <queue>
using namespace std;
int fac[9]={1,1,2,6,24,120,720,5040,40320};
char c[10];
int dx[4]={1,-1,3,-3};
int a[10],b[10],h[400000];
int p0,t=46686;//target status 
queue <int> q;
bool vis[400000];
int f(int a[]){
	bool v[10]={0};
	int ans=0;
	for(int i=0;i<9;i++){
		int cnt=0;
		for(int j=0;j<a[i];j++)
			if(v[j]==0)cnt++;
		ans+=cnt*fac[8-i];
		v[a[i]]=1;
	}
	ans++;
	return ans;
}
void rev(int x){
	x--;
	bool v[10]={0};
	for(int i=8;i>=0;i--){
		a[8-i]=x/fac[i];
		int tot=0,j=-1;
		while(tot<=a[8-i]&&j<=8){
			j++;
			if(v[j]==0)	tot++;
						
		}
		a[8-i]=j;v[j]=1;
		x%=fac[i];
	}
	return;
}
int main(){
	scanf("%s",c);
	for(int i=0;i<9;i++)a[i]=c[i]-'0';
	int tmp=f(a);
	printf("%d\n",tmp);
	rev(tmp);
	for(int i=0;i<9;i++)printf("%d\n",a[i]);
	q.push(tmp);
	vis[tmp]=1;
	while(!q.empty()){
		int k=q.front();
		q.pop();
		rev(k);
		for(int i=0;i<9;i++){
			if(a[i]==0){
				p0=i;break;
			}
		}
		for(int i=0;i<4;i++){
			int tmp2=p0+dx[i];
			if(tmp2<0||tmp2>8)continue;
			for(int j=0;j<9;j++)b[j]=a[j];
			b[tmp2]=a[p0];
			b[p0]=a[tmp2];
			int tmp1=f(b);
			if(vis[tmp1]==0){
				h[tmp1]=h[k]+1;
				vis[tmp1]=1;
				q.push(tmp1);
			}	
			if(tmp1==t){
				printf("%d",h[tmp1]);
				return 0; 
			}	
		} 	
	}
	return 0;
}

2022/9/24 15:37
加载中...