全排列散列

位置是一个数组,将位置数组通过全排列散列映射到一个int值.在进行位置变换时,将int值解析成位置数组,变换完成后再将新数组映射到int值.这样很麻烦.能否不通过解压int直接进行位置变换?

打表法要义

从目的状态出发,进行广度优先遍历,用一个队列足矣.
广搜时状态转移为最简操作集的逆操作,这样才能保证输出结果是正操作.
比如6面异色正方体向下向右旋转,在从目标状态出发产生新状态时,要向上,向左操作. 向上向左产生的状态插入到状态队列中去.
从目的状态到x状态的序列为:上上左上.则从x状态返回目标状态就是下右下下.
对于逆操作,只需要通过改动数据表来实现.而数据表是无论如何无法避免的.
对于操作序列,可以用字符串表示,也可用int值表示.用int值表示时op=op<<1|0或者op=op<<1|1.  

其它思路

启发式搜索:如果无法前进也要后退.
投票搜索,8个人投票决定下一个操作是什么,像神经网络中的神经元一样.
双向广搜:从目标结点和源节点同时进行搜索,原来的3^19变成了2*3^9.
多点广搜,在魔方图中找到几个核心点,知道这些核心点怎么去目标结点,从这些核心点出发进行广搜.就像双向广度优先搜索一样.也就是说在地球表面均匀的建立几个基站, 这些基站都知道如何到达北极点.给定一个点,问它如何到达北极点时.从给定点出发进行广搜, 直到找到一个基站为止.因为基站的存在保证了对于地球上每一个点, 离他4步以内必然存在至少一个基站.这样一来就可以通过一次广搜找到基站, 从基站到北极点可以通过查表得到.