我正在解决8-puzzle。这是一个看起来像这样的问题:
图片由https://ece.uwaterloo.ca/~dwharder/aads/Algorithms/N_puzzles/提供(您还可以在那里查看有关8-puzzle的更详细说明)。用户可以将与坯料相邻的正方形移动到坯料中。任务是恢复图中所示的安排,从任意安排开始。
现在,状态当然可以描述为9位数的排列。如果显示图片,则排列为:
1 2 3 4 5 6 7 8 0
但是,并非所有排列都可以从显示的配置中获得。因此,我有以下问题。
通过将磁贴滑动到空白中,从显示的初始配置中获得的排列数是多少?
调用上面N的答案。现在,我想要从1到N的整数到排列的1-1映射。也就是说,我希望有一个函数,它接受一个排列并返回一个适当的整数,以及一个取整数并返回排列的函数。映射必须是双射(即不完美的散列是不够的)。
答案 0 :(得分:2)
答案 1 :(得分:1)
如果您只想枚举可以达到的不同可能状态,那么您可以从初始状态深入搜索第一个。在给定当前状态的情况下生成有效的下一个状态是非常有可能的,例如:将一个瓦片向下移动到空白空间与将0瓦片在排列中交换为瓦片3相同(如果有的话)。所以你只需要做一个dfs并保留所有排列的hashset作为你访问过的数组,它可以存储为int或字符串。只有9个!可能的状态只有362880.如果你需要从整数集合中进行1-1映射,只需将hashset设为哈希表,每次找到新状态时,只需将其添加到下一个索引的哈希表中即可。您也可以先找到最短的解决方案,然后在找到解决的状态时先断开。