只有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;
}

转载于:https://www.cnblogs.com/lokiii/p/9770958.html

洛谷 P2578 [ZJOI2005]九数码游戏【bfs+康托展开】相关推荐

  1. 万圣节后的早晨九数码游戏——双向广搜

    https://www.luogu.org/problemnew/show/P1778 https://www.luogu.org/problemnew/show/P2578 双向广搜. 有固定起点终 ...

  2. 洛谷P4301 [CQOI2013]新Nim游戏

    洛谷P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火 ...

  3. 洛谷P2006 赵神牛的游戏

    洛谷P2006 赵神牛的游戏 ac代码: #include using namespace std; int main () { long long int k,m,n,s,a,b; cin>& ...

  4. 题解 洛谷 P4042 [AHOI2014/JSOI2014]骑士游戏

    洛谷P4042[AHOI2014/JSOI2014]骑士游戏\color{#00F}{洛谷\ P4042\ [AHOI2014/JSOI2014]骑士游戏}洛谷 P4042 [AHOI2014/JSO ...

  5. Vijos 1029 晴天小猪历险记之Number【BFS+康托展开】

    Vijos 1029 背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难--终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它-- 晴天小猪一推开门,就发现那里--空 ...

  6. 洛谷:P1129 [ZJOI2007] 矩阵游戏(二分图最大匹配)

    洛谷:矩阵游戏 洛谷题解就挺好 目的是使得最终(1,1)(2,2)-(n,n)都有一个点 可以看作为,最终状态需要每 i 行和 i 列都存在一个匹配 建图方式:对于 i 行 j 列的1点,建一条 i ...

  7. 【洛谷】P2356 弹珠游戏 c++

    题目背景 元宵节不放假挺郁闷的,于是时间机智的改到了星期6一整天! 题目描述 MedalPluS 和他的小伙伴 NOIRP 发掘了一个骨灰级别的游戏--超级弹珠. 游戏的内容是:在一个 n*n 的矩阵 ...

  8. 洛谷:P1129 [ZJOI2007] 矩阵游戏

    题目链接:P1129 [ZJOI2007] 矩阵游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 解题思路: 首先不知道最大匹配数概念的可以看看这篇博客: (5条消息) 二分图及 ...

  9. bzoj5248(洛谷4363)(2018九省联考)一双木棋

    题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...

  10. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

最新文章

  1. sql查询语句优化需要注意的几点
  2. import android.view.window;,尝试在空对象引用上调用虚拟方法‘android.view.Window$回调...
  3. 【No.7 C++对象的构造与析构时间】
  4. Linux下配置DNS
  5. 重学java基础第十六课:jdk jre jvm
  6. Web Hacking 101 中文版 十五、代码执行
  7. 获得系统异常的详细信息
  8. hdu 4991 Ordered Subsequence
  9. 傅立叶变换系列(四)离散傅立叶变换
  10. 学了python能干啥举例-原来Python可以做这么多有趣的事情
  11. matplotlib--python的数据可视化二
  12. linux下防火墙基础知识之iptables
  13. IDEA 自动导入的配置(Auto import)
  14. 【Linux网络编程(九)】ping命令 arp工作流程
  15. 亿级流量电商详情页系统的大型高并发与高可用缓存架构
  16. Android模仿QQ的左右滑动切换界面和下拉更新的效果
  17. assign 和 weak
  18. RHEL目录和文件操作:Linux文件系统管理
  19. 一份数据科学“必备”的数学基础清单
  20. 荷兰黑客将他孩子的乐高列车放在区块链上

热门文章

  1. maven项目转换成dynamic项目
  2. pku 3592 Instantaneous Transference tarjan缩点重建图+spfa求最长路
  3. 春招 | 风控独角兽 数美科技 NLP、ASR算法工程师 - 25k-35k/月
  4. 【Pre-Training】XLNet:预训练最强,舍我其谁
  5. 【NLP基础】手把手带你fastText文本分类(附代码)
  6. 字符集及其存储方式(解决乱码问题)
  7. 深度学习优化算法入门:二、动量、RMSProp、Adam
  8. 【每日算法Day 103】老题新做,几乎不会有人想到的解法,它来了
  9. 百面机器学习—9.前馈神经网络面试问题总结
  10. 机器学习基础算法23-XGBoost实践