题目
给你一个1-8的字符串和一个位置x,如13264578x
代表
1 3 2
6 4 5
7 8 x
要求将状态通过重复x与相邻位置交换过程,将局面复位为
1 2 3
4 5 6
7 8 x
要求在最少步数的情况下,输出路径
x向上走则为u,向下d,向左l,向右r
思路来源
https://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html
http://www.bubuko.com/infodetail-635279.html(八数码的八境界)
题解
令x的位置=9,1-9共用9!=36W种状态,康托展开压进36W数组,
从123456789终态逆向bfs,预处理每个状态的后继状态是什么字母,
注意字母应反向,如cantor(123456789)通过l到达cantor(123456798)
则记pre[cantor(123456798)]=cantor(123456789);ans[cantor(123456798)=l;
在询问的时候沿着pre跳就好了,对于有解的情况不过20步左右
朴素的康托展开O(9*9),乘以36W状态,不会超时
心得
去年10月份的大一作业,现在才补上,
因为这个学了康托展开、IDA*入门和A*入门
后来发现后二者并没什么用,并不怎么会用到
八数码的八境界,我大概只能达到第二三重吧,补上就好了
代码
#include
#include
#include
#include
#include
#include
#include