只有9!=362880个状态,用康托展开hash一下直接bfs即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=1000005,fac[]={1,1,2,6,24,120,720,5040,40320,362880},d1[]={4,1,2,7,5,3,8,9,6},d2[]={1,2,3,6,4,5,7,8,9};
int a[15],b[15],v[15],dis[N],la[N],tot;
long long s,t=123456789,ans[N];
int has(long long x)
{
for(int i=9;i>=1;i--)
a[i]=x%10,x/=10;
int r=0;
for(int i=1,sm;i<=9;i++)
{
sm=0;
for(int j=i+1;j<=9;j++)
if(a[j]<a[i])
sm++;
r+=fac[9-i]*sm;
}
return r;
}
long long rel(int x)
{
memset(v,0,sizeof(v));
long long r=0;
for(int i=9;i>=1;i--)
{
int t=x/fac[i-1];
x%=fac[i-1];
for(int j=1,w=0;j<=9;j++)
if(!v[j])
{
w++;
if(w==t+1)
{
r=r*10+j;
v[j]=1;
break;
}
}
}
return r;
}
int main()
{
for(int i=1,x;i<=9;i++)
scanf("%d",&x),s=s*10+x+1;
s=has(s),t=has(t);//cerr<<s<<" "<<t<<" "<<rel(s)<<" "<<rel(t)<<endl;
queue<int>q;
dis[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();//cerr<<u<<endl<<rel(u)<<endl;
q.pop();
if(u==t)
break;
long long x=rel(u),v1=0,v2=0;
for(int i=9;i>=1;i--)
a[i]=x%10,x/=10;
for(int i=0;i<9;i++)
v1=v1*10+a[d1[i]],v2=v2*10+a[d2[i]];//cerr<<v1<<" "<<v2<<endl;
v1=has(v1),v2=has(v2);//cerr<<v1<<" "<<v2<<endl;
if(!dis[v1])
la[v1]=u,dis[v1]=dis[u]+1,q.push(v1);
if(!dis[v2])
la[v2]=u,dis[v2]=dis[u]+1,q.push(v2);
}
if(!dis[t])
{
puts("UNSOLVABLE");
return 0;
}
printf("%d\n",dis[t]-1);
for(int i=t;i!=s;i=la[i])
ans[++tot]=rel(i);
ans[++tot]=rel(s);
for(int i=tot;i>=1;i--)
{
for(int j=1;j<=9;j++)
a[j]=ans[i]%10-1,ans[i]/=10;
printf("%d %d %d\n%d %d %d\n%d %d %d\n\n",a[9],a[8],a[7],a[6],a[5],a[4],a[3],a[2],a[1]);
}
return 0;
}

最新文章

  1. 推荐一个不错的在线制图网站---ProcessOn
  2. linux 软连接和硬链接
  3. Result Maps collection already contains value for
  4. java集合框架之List
  5. core java 10~12(多线程 &amp; I/O &amp; Network网络编程)
  6. 基于 WebAPI 的 API 实现
  7. Oracle DB 执行表空间时间点恢复
  8. splay模板
  9. Xcode 运行报错:“Your build settings specify a provisioning profile with the UUID ****** however, no such provisioning profile was found”
  10. “聊天剽窃手”--ptrace进程注入型病毒
  11. QT之TCP通信
  12. 实训任务01:安装Hadoop
  13. PHP之单例模式
  14. 如何实现织梦dedecms表单提交时发送邮箱功能【已解决】
  15. JS几种变量交换方式以及性能分析对比
  16. Mysql进阶-day1
  17. BZOJ 1177 Oil(特技枚举)
  18. U3D 基础
  19. Go语言 基本类型
  20. 如何控制table中td内的文本位置

热门文章

  1. 【iOS】系统框架学习
  2. 封装算法: 模板方法(Template Method)模式
  3. 李洪强iOS开发之-修改状态栏的字体的颜色
  4. c++string 输入换行符
  5. 新产品为了效果,做的比較炫,用了非常多的图片和JS,所曾经端的性能是非常大的问题,分篇记录前端性能优化的一些小经验。
  6. Tomcat的虚拟主机的配置
  7. QT实现FTP服务器(三)
  8. phpexcel导出后乱码或者是打不开文件必须修复的问题
  9. oracle服务丢失的处理方法之OracleServiceORCL不存在示例
  10. 通过ODC方法改善软件测试:3个案例研究