分析
直接爆搜或者存储每一个状态空间时间双炸。
看到每个状态都是一个排列,所以考虑排列与自然数的双射——康托展开&逆展开
预处理阶乘,并且把0变成9(方便排列),然后就用362880个康托展开数作为状态的依据,入队之后再逆展开出来处理变化和判断等,再转回来进队。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int target=581;//123894765
string st;
int fac[10]={
1,1,2,6,24,120,720,5040,40320,362880};
int q[400001],z;
int step[500001],v[500001];
void pre()
{
for(int i=0;i<=8;i++) if(st[i]=='0') st[i]='9';
for(int i=0;i<=8;i++) z=z*10+st[i]-48;
}
int trans