HDUOJ1043Eight 八数码问题可以构造解
POJ朴素搜索能过的Eight,到HDU的变态数据就过不去了,然而无论双广还是A*都无法实现statistic里0ms的神迹。Discuss里看到了罗教主的一个回帖——构造解!于是专门向罗教主请教了一下,竟然没看懂他的回答。
走亲戚和表弟拿纸片玩了好一会儿,发现了一点蛛丝马迹。
构造的方法不止一种,斌仔的就和我的不一样,不过原理是相同的。直接八个数分开说吧:
首先给八个位置标号,方便描述
'1':很容易归位。
'2':不移动'1'的情况下也很容易归位。
'3':适当调整,保证位置4不是'3'也不是'x',将'1’、'2'逆时针旋转到4、1位置,然后在不移动'1'、'2'的情况下可以把'3'移动到位置2,此时'1'、'2'、'3'刚好在4、1、2构成顺时针,再将'1'、'2'、'3'顺时针转回位置1、2、3,则'1'、'2'、'3'定位。
'4'、'5'、'6'的定位方法和'1'、'2'、'3'相同原理,只是操作上略有不同,这时候比前面容易许多。
'4':直接定位。
'5':直接定位。
'6':转'4'、'5'到位置7、4,把'6‘移动到5,顺时针一次'4'、'5'、'6'定位。
此时'7'、'8'显然都在第三行,如果'x'不在9,移动一下即可。
顺便也可以判断有无解,如果最终'7'在位置8,则无解,否则有解(可根据逆序数推证)。
实现的方法也有一定技巧性,逻辑不同实现的效率和代码的长度也会有很大差别,一个思路简单的方法就是写好几个固定的旋转函数,直接调用,题目没有要求解的长短,所以多转几圈无所谓。
代码就不贴了,算是个思维游戏,没有什么算法可言。
试代码的过程中斌仔还发现ZOJ的Static可以刷榜的,如果代码效率在前面,能把那一页全刷成自己的……算不算bug呢。。。
索性做了个控制台的八数码游戏,有兴趣的朋友可以下载来玩玩。