八数码问题,可以用单向广搜、双向广搜、A*、IDA等多种方法求解。具体可以参考:八数码的八境界
Description
1 | 1 2 3 4 |
1 | 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 |
Input
1 | 1 2 3 |
1 | 1 2 3 x 4 6 7 5 8 |
Output
You will print to standard output either the word unsolvable’’, if the puzzle has no solution, or a string consisting entirely of the letters ‘r’, ‘l’, ‘u’ and ‘d’ that describes a series of moves that produce a solution. The string should include no spaces and start at the beginning of the line.
Sample Input
1 | 2 3 4 1 5 x 7 6 8 |
Sample Output
1 | ullddrurdllurdruldr |
题解:
本题一共仅有9!种结果,因此求解方法很多。一开始采用stl进行存储,但一直超时,后来改用hash轻轻松松就过了。判重时9!个排列如果用数组直接保存,每一位保存一个维度,数组开不了那么大。因此可以根据康托展开进行判重,每一种排列对应成一个整形数字,9!种排列一共9!个数字,提高了hash效率。此外,对于x我们暂且当做9处理,而123456789的康托展开是1,因此bfs的终止条件就设为当前状态的康拓展开是否为1。此外,由于本次采用正向bfs,而输出结果时需要输出之前的状态,string储存太慢,queue队列会丢失之前的状态,因此用数组充当队列,用pre追溯上一个状态在队列中的下标。解决代码如下:
1 | #include<iostream> |