蟒蛇 – 谜语:广场拼图

最近几天,我已经避开了大师的学习,并一直专注于这个(看起来很简单)的难题:

这个10 * 10的网格是100个可用的地方的平方。目的是从一个角落开始,遍历所有的地方相对于一些简单的“遍历规则”,并达到数字100(如果你是程序员99,而以0开头代替:)

遍历规则为:
两个空间沿垂直和水平轴跳跃
沿着对角线的一个空间跳
你可以访问每个广场一次

为了更好地可视化,这里是一个有效的示例遍历(直到第8步):
Example Traverse http://img525.imageshack.us/img525/280/squarepuzzle.png

手动地,我一直在为无聊的这个难题而努力。多年来,我试图用手来解决它,但我从未超过96.听起来很容易吗?尝试自己,看看自己:)

因此,为了解决这个问题,我在Python中开发了一个简短的(大约100行代码)程序。我是这个语言的初学者,我想看看我能做什么。
该程序简单地应用详尽的尝试&错误解决技巧换句话说:暴力深度首先搜索。

我的问题来自于这里:程序,不幸的是不能解决问题,因为状态空间是如此之大,搜索从来没有结束,没有找到解决方案。它可以达到98(并打印),没有太多的困难,但不是一个完整的解决方案。
该程序还打印出迄今为止涵盖的搜索树的长度。在几分钟之内,来自第65个元素的遍历列表被覆盖到最后,仅仅是一条路径。这个数字以指数级增长的时间段减少。我已经运行代码了相当长的一段时间,不能超过50个障碍,现在我相信。

似乎这个简单的方法是不够的,除非我永远运行它。那么,如何改进我的代码来更快更有效地提出解决方案呢?

基本上,我期待着看到如何做到:

>捕获和利用专门针对此问题的领域知识
>应用编程技巧/技巧来克服疲劳

并最终实现了实质性的解决方案。

提前致谢。

修订版
感谢Dave Webb将问题与域名相关联:

This is very similar to the Knight’s
Tour problem which relates moving a
knight around a chess board without
revisiting the same square. Basically
it’s the same problem but with
different “Traverse Rules”.

这与Knight’s Tour问题非常相似,这个问题涉及将骑士围绕棋盘移动,而无需重新查看相同的方格。基本上这是同样的问题,但不同的“横移规则”。

我记得通过递交骑士巡回赛的关键优化是让您的下一个动作以目的地广场上的可用移动数量的增加顺序排列。这鼓励搜索在一个地区尝试和密集地移动,填补它,而不是放大全部,并留下永远不能访问的小岛屿广场。 (这是Warnsdorff’s algorithm.)

还要确保你已经考虑到对称性。例如,在最简单的层次上,您的起始正方形的x和y只需要上升到5,因为(10,10)与板旋转相同(1,1)。

http://stackoverflow.com/questions/767912/riddle-the-square-puzzle

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:蟒蛇 – 谜语:广场拼图