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呢。。。

 

索性做了个控制台的八数码游戏,有兴趣的朋友可以下载来玩玩。

转载于:https://www.cnblogs.com/CSGrandeur/archive/2012/08/27/2659116.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值