Board logo

标题: 跳马遍历问题 [打印本页]

作者: 天痕    时间: 2005-1-12 08:52

不论先后:
做出1得300
做出2得1000

1:跳马问题
国际象棋盘上某点上有一马,让马遍历整个棋盘没有重复。
输入:马的位置(I,J)(1〈=I〈=8;1〈=J〈=8)
输出:跳法(给棋盘标号)

2:还是跳马问题
在1的基础上按跳的顺序给棋盘上的点编号,最后要求跳出个8阶幻方来
输入:马的位置(I,J)(1〈=I〈=8;1〈=J〈=8)
输出:跳法(给棋盘标号)
时限:20s

参加者以附件形式提交程序



谨以第二题纪念逝者~~
作者: loranrowe    时间: 2005-1-12 09:30



QUOTE:
原帖由天痕于2005-01-12, 8:52:06发表
不论先后:
做出1得500
做出2得1000

1:跳马问题
国际象棋盘上某点上有一马,让马遍历整个棋盘没有重复。
输入:马的位置(I,J)(1〈=I〈=8;1〈=J〈=8)
输出:跳法(给棋盘标号)

2:还是跳马问题
在1的基础上按跳的顺序给棋盘上的点编号,最后要求跳出个8阶幻方来
输入:马的位置(I,J)(1〈=I〈=8;1〈=J〈=8)
输出:跳法(给棋盘标号)
时限:20s



谨以第二题纪念逝者~~  

第一个的代码等一下贴
幻方是指横竖斜的和都相等?
斜仅指主对角线吧?
作者: 天痕    时间: 2005-1-12 09:33

幻方是指横竖斜的和都相等?
斜仅指主对角线吧?

是的

第一个纯粹送钱,第二个有时间限制的才有意义。

第一题奖金改少了,不过既然你先发帖了你的就不变吧~~
作者: 天痕    时间: 2005-1-12 09:41

我先去睡觉
6小时后回来查收

本题1截止于北京时间1月15日零点
题2不设截止时间
作者: loranrowe    时间: 2005-1-12 09:50

现已证明:互不同构的八阶幻方至少存在12 631 127 040组。(这个数字我没考证过)
这版程序每秒只能搜索400k步左右,显然构造所有幻方的想法是不成立了
只能通过检验knight tour的solution来解决了
假设solution的平均搜索步数为40k,20s只能有200个可行解
考虑java的效率问题,改编为c++,最多也只有2000个可行解
看来还得优化程序啊

附件: knighttour.rar (2005-1-12 09:50, 2.94 K) / 该附件被下载次数 228
http://xycq.org.cn/forum/attachment.php?aid=3396
作者: 天宫公主    时间: 2005-1-12 10:04

题目和我上大一时的一个家庭作业一样,我用的是C++,最后算了一夜才出来的。就说当时的电脑还都是奔3一类的,可20秒也忒短的点吧?
作者: kulaog    时间: 2005-1-12 14:46

先算出第一题。
第二题只要判断是不是八阶幻方就可以拉,还需要知道“互不同构的八阶幻方至少存在12 631 127 040组”有什么用啊。
现在手懒,做不动,提个小建议。
作者: loranrowe    时间: 2005-1-12 14:58



QUOTE:
原帖由kulaog于2005-01-12, 14:46:56发表
先算出第一题。
第二题只要判断是不是八阶幻方就可以拉,还需要知道“互不同构的八阶幻方至少存在12 631 127 040组”有什么用啊。
现在手懒,做不动,提个小建议。

单纯优化跳马问题,可以将解决时间降到毫秒级
可是想要单纯搜索某点所有跳马问题的解,找出其中八阶幻方的解
或者搜索所有某点为1的不同构的八阶幻方,从中找出跳马问题的解
估计时间在小时级
除非找到一个好的解发生算法,能够兼顾两个问题的求解
作者: kulaog    时间: 2005-1-12 15:05

先算出第一题,放到内存里面,数量就是有限的,然后判断每一种跳法是不是八阶幻方就可以啦,事情就是一步一步做的啊。为什么要一口吃成胖子啊。
8+8+2=18,只要12次加法就可以算出这种跳发是不是八阶幻方,12*n步,也不多阿。应该比第一个还快啊。
作者: kulaog    时间: 2005-1-12 16:28

只要检验结果是不是八阶幻方,谁要你算出八阶幻方又多少可能啦。

就好像给你10组数字,每组2个数字,问你那组数字加起来等于0。
而你却要求出所有加起来等于0的2个数字,这个也没有解啊。

关键在于是检验不是求解。
作者: 天痕    时间: 2005-1-13 04:27

loranrowe第一题正确!
loranrowe 2005-01-13  ¥ 500 轩辕通宝


不过建议用C++来,JAVA的速度实在不敢恭惟啊~~


loranrowe能不能把“改进的启发式算法求得可行解的平均步数为73”说详细一点?这个我好像不知道
作者: loranrowe    时间: 2005-1-13 09:19



QUOTE:
原帖由天痕于2005-01-13, 4:27:55发表
“改进的启发式算法求得可行解的平均步数为73”

其实就是用了la Warnsdorff矩阵,这个矩阵记录了棋盘各点的度数
这个是初始矩阵
2,3,4,4,4,4,3,2
3,4,6,6,6,6,4,3
4,6,8,8,8,8,6,4
4,6,8,8,8,8,6,4
4,6,8,8,8,8,6,4
4,6,8,8,8,8,6,4
3,4,6,6,6,6,4,3
2,3,4,4,4,4,3,2
每走一步,将相关点的度数减1
每步尽量先走度数小的点
度数相等的点边角优先
还有其他一些规则
据Dr. Gerald Wildenberg的文章说
在这种原则下,以棋盘上的各点为起始点,求得第一个解的平均搜索步数为73
不过我很怀疑他提供的数据,因为他竟然有两个点fail了,就是在10M步中没有找到解

ps:
第一个题用java语言是因为那是以前做的作业题...
从硬盘上翻出来就提交了




欢迎光临 轩辕春秋文化论坛 (http://xycq.org.cn/forum/) Powered by Discuz! 5.0.0