我就想问,为什么不对。
我就想问了,为什么不对
#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;
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;
}