热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

4X4数字拼图的自动求解程序下载,手玩技巧及数学原理

首先,推荐一款非常棒的4X4数字拼图的求解程序,是一个日本人写的,单个exe文件,快速求得最优解,并且可以动画演示。15puzzleOptimalso

首先,推荐一款非常棒的4X4数字拼图的求解程序,是一个日本人写的,单个exe文件,快速求得最优解,并且可以动画演示。

"15puzzle Optimal solver" for windows

  下载: 15puzzle.zip (267KB)

  下载: 15puzzle.exe (580KB)

以下部分为转载:

​​​​​   * 益智游戏是一种较为大众化的应用数学,任何人不论对数学是否感兴趣,或多或少都会为它着迷。主要是因为它具有趣味性、消遣性及益智性,而不似一般数学那麽 的深奥及枯燥。当然最主要的是因为它的大众化,无需具有高深理论即可实施,故不分男女老幼及教育程度,都能享有这份乐趣!
    * 数字拼图就是这样的一个数学益智游戏,每隔一段时间就会掀起一阵流行,在小朋友间尤其普及,是一个十分 迷人的个人操作游戏。
    * 一般的游戏方式或市售的数字盘,是在一个 4 * 4 的盘面中放入 1~15 的数字,并保留一个空格,游戏者的任务是利用移动空格旁边的数字到空格中的方法,使得所有的数字由左而右、由上而下依序排列 (以下简称顺 序花式) ,所以本游戏也被叫做「移动十五」、「十五子棋」、「十五子迷」、「数字智慧盘」等。
    * 其实这个游戏并不必限定在 4*4 的盘面中操作,但是市售的实体数字盘要做到任意改变大小似乎有点困难,而 且 4*4 的盘面难易度最为适中,所以大家就习以为常了。
    * 数字拼图通常的玩法有下列几种:
  1. 第一种玩法:将数字盘中的数字方块全部倒出,然后随意的将数字方块装回盘中(以下简称随机花式),请游 戏者排出顺序花式。
    8 4 7
    9 12 13 10
    3 5 15 1
    11 6 14 2
    ===>
    1 2 3 4
    5 6 7 8
    9 10 11 12
    13 14 15
    ( 图 1 ) 随机花式一例。
  2. 第二种玩法:将数字盘中的数字方块先排成顺序花式,然后随意移动到满意为止(以下简称随移花式),请游戏者复原成顺序花式。
    8 2 1 13
    10 4 5 14
    7 9 11
    3 12 15 6
    ===>
    1 2 3 4
    5 6 7 8
    9 10 11 12
    13 14 15
    ( 图 2 ) 将数字方块随意移动后,再要求复原。
  3. 第三种玩法:游戏的目的花式不再是顺序花式,而是指定的任一种花式,请游戏者由目前花式转换过去。
    1 2 3 4
    5 6 7 8
    9 10 11 12
    13 14 15
    <===>
    1 3 5 7
    9 11 13 15
    2 4 6 8
    10 12 14
    <===>
    1 2 3 4
    12 13 14 5
    11 15 6
    10 9 8 7
    ( 图 3 ) 由指定的花式变成另一个花式。


研究问题

    * 任何一个有经验的人都知道,既然第二种玩法旳随移花式是由顺序花式任意移动后造出的,那麽理论上, 只要顺着相反的顺序移动回去,当然可以还原成顺序花序,至于其他的两种玩法都会有无法达成目标的情形发生。
    * 以图 1 左边的随机花式为例,如果你已掌握了操作的秘诀,应该可以很快的将它排成下图中央的逆序花式,在这种情况下,如果不把数字方块拿出盘面再放回去,而只用规定的移动方式,是绝对无法排出顺序花式的。
8 4 7
9 12 13 10
3 5 15 1
11 6 14 2
===>
1 2 3 4
5 6 7 8
9 10 12 11
13 14 15
===>
不可能
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15
( 图 4 ) 逆序花式和顺序花式。

    * 如果你的经验够丰富了,你会发现:所有的随机花式都可藉由规定的移动方式排成逆序花式和顺序花式之一, 无一例外。
    * 当可以用规定的方式移动数字方块,使得某一随机花式排成顺序花式时,我们称之为有解,反之是为无解。
    * 问题来了:
         1. 如果已知某一个随机花式有解,该如何移动才能顺利达成目标呢?
         2. 有没有一个简易的方法来判定怎样的随机花式有解,怎样的随机花式无解呢?

移动的操作技巧

    * 稍有经验的人都知道,即使明知有解,但有些人就是可以在短时间内将数字东移西移,经过一番处理之后 迅速归位以完成任务,有些人却是千试万试,不论如何移动,就是无法把数字塞到指定的位置以完成任务。 其差别就在有没有理解并应用以下的一些移动技巧罢了。
    * 要把数字 1、2 移入位置 1、2 ,因为几乎可说是没有任何限制,所以应该是不会有问题的,只是使用 的步数多少的差别而已。
    * 本游戏的第一个考验来了,如果依样画葫芦,贸然把 数字 3 移入位置 3 后(如图 5),想把数字 4 移 入位置 4,如果不知道以退为进的道理,可能永远都在绕圈子。一般人初试数字拼图游戏,把数字 1、2、3 移入位置 1、2、3 后觉得容易,但在移入 4 时遇到大麻烦,如果没有人指点开窍, 很可能就心生畏怯,再也不踫本游戏了。以下把处理相关状况的技巧略举一二,只要学会其中的一个, 就可应付自如了。
    * 状况一:1、2、3 已就位, 4 从左方来,如何让 4 就位?

      ( 图 5 ) 状况一:1、2、3 已就位, 4 从左方来,如何让 4 就位?

步骤:(有些简单步骤省略)

      本状况的处理,要打破已摆好位置的数字不要再动的迷思,否则虽也可用类似状况 3 、4 之解法,但求 解步骤将大幅增加。本解法也可适用于「5、6、7 已就位, 8 从左方来,如何让 6 就位?」的情形。
    * 状况二:1、2、3 已就位, 4 从下方来,如何让 4 就位?

      ( 图 6 ) 状况二:1、2、3 已就位, 4 从下方来,如何让 4 就位?
      本状况也可适用于「5、6、7 已就位, 8 从下方来,如何让 8 就位?」的情形。
    * 状况三:1、2、3 已就位, 4 从右下方来,如何让 4 就位?

      ( 图 7 ) 状况三:1、2、3 已就位, 4 从右下方来,如何让 4 就位?
      本状况也可适用于「5、6、7 已就位, 8 从右下方来,如何让 8 就位?」的情形。
      由解答示范的第一步竟然回头向下走,可以给我们一个警示,以后遇此状况,就不要向上去逼近是非之地比较好。
    * 状况四:1、2 已就位, 如何让 3、4 就位?

      ( 图 8 ) 状况四:1、2 已就位, 如何让 3、4 就位?
      本状况示范数字 3、4 都尚未就位时,比较节省移动步数的方法,尤怪把它叫做倒车入库,先把数字 3 放到位置 4 , 数字 4 移到数字 3 的下方后再倒退就位;有时则要以相反的方式处理:先把数字 4 放到位置 3 , 数字 3 移到数字 4 的下方后再倒退就位。如何应用要看盘面数字的相对位置而定,所谓应用之妙存乎一心是也。
    * 状况五:上半部已就位, 如何让最后两列就位?

      ( 图 10 ) 状况五:上半部已就位, 如何让最后两列就位?
      本示范提示我们:不管几行几列,上半部可以用状况 1~4 的着法一列一列摆好,但是最后两列一定要先把最左一 行的两个数字摆好位置,依次由左而右安排才好。对许多初学者来说,这也是一大障碍点。
    * 掌握以上操作要领之后,保証能让你一路顺风,赶快披挂上阵,表现一下吧!

逆序和判别法

    * 虽然已学会了移动的技巧,但稍有经验的人都知道,如果採用随机花式的玩法,将会有一半的机率出现无解的情形,花费了一番工夫之后才发现无解时,那种滋味可 真不好受。如果採用的是转换指定花式的玩法,尤其是有人出题互考时,最后才发现被以无解的情形来戏弄了,不也有点不甘心?所以如果学会了是否有解的判定法 之后,在移动前就判定了是否有解,不是反可让那些想戏弄我们的人被唬得一愣一愣的吗?
    * 要判别指定的随机花式是否有解,逆序和判别法是较易于上手的方法。
    * 本法判别的步骤如下:
         1. 第一步:空格归位。
            可以用任意的移动方式把空格移到右下角。以图 1 和图 2 的随机花式为例,图 11 和图 12 分别採用了不 同的归位方式。
           
8 4 7
9 12 13 10
3 5 15 1
11 6 14 2
===>
9 8 4 7
3 12 13 10
11 5 15 1
6 14 2
( 图 11 ) 以先下移后右移的方式将空格归位。

8 2 1 13
10 4 5 14
7 9 11
3 12 15 6
===>
8 2 1 13
10 4 5 14
7 9 11 6
3 12 15
( 图 12 ) 以先右移后下移的方式将空格归位。

           
         2. 第二步:点数逆序的个数,并求其和。
            把数字盘中的数字当成一个数列,其顺序为由左而右、由上而下,以图 11 右边的归位花式而言, 可看成是下面的数列
            9, 8, 4, 7, 3, 12, 13, 10, 11, 5, 15, 1, 6, 14, 2
            什麽是逆序呢? 当数列中较小的数字位置在较大数字的后方时,就是逆序。
            以上面的数列为例,
            数字 9 共有 8 个逆序,因为 1, 2, 3, 4, 5, 6, 7, 8 都在它的后方,
            数字 8 共有 7 个逆序,因为 1, 2, 3, 4, 5, 6, 7 都在它的后方,
            数字 4 共有 3 个逆序,因为 1, 2, 3 都在它的后方,
            数字 7 共有 5 个逆序,因为 1, 2, 3, 5, 6 都在它的后方,
            数字 3 共有 2 个逆序,因为 1, 2 都在它的后方,
            数字 12 共有 6 个逆序,因为 1, 2, 5, 6, 10, 11 都在它的后方,
            数字 13 共有 6 个逆序,因为 1, 2 5, 6, 10, 11 都在它的后方,
            数字 10 共有 4 个逆序,因为 1, 2 5, 6 都在它的后方,
            数字 11 共有 4 个逆序,因为 1, 2 5, 6 都在它的后方,
            数字 5 共有 2 个逆序,因为 1, 2 都在它的后方,
            数字 15 共有 4 个逆序,因为 1, 2, 6, 14 都在它的后方,
            数字 1 共有 0 个逆序,因为它就是最小的数了,
            数字 6 共有 1 个逆序,因为只有 2 在它的后方,
            数字 14 也只有 1 个逆序,就是 2,
            数字 2 已是数列中的最后一个数字了,当然没有逆序。
            所以逆序和就是 8 + 7 + 3 + 5 + 2 + 6 + 6 + 4 + 4 + 2 + 4 + 0 + 1 + 1 = 53
         3. 第三步:判定。逆序和为偶是有解,为奇则无解。
            由于图 5 的逆序和为 53,所以图 11 的随机花式无解。
            请读者自行计算试试,图 12 的归位花式其逆序和为 38,所以图 12 的随机花式有解。
            想到了吗?在第二步计算逆序和时,其实可以偷一下懒,只注意和是奇偶就好, 不必老老实实的加总,那很累的!(看不懂?没关係!当做尤怪我没说就好了)
    * 因为我们的目的花式(顺序花式)逆序和为 0 是偶数,所以所有有解的花式也一定是偶数逆序和。
      如果我们的目的花式(例如逆序花式)逆序和是奇数,则所有有解的花式也一定是奇数的逆序和。

轮换判别法

    * 要判别指定的随机花式是否有解,逆序和判别法虽然较易于上手,但是点数起来有点麻烦不是吗? 如果你有同感,那试试轮换判别法吧!
    * 本法判别的步骤如下:
         1. 第一步:空格归位。同逆序和判别法之操作。
         2. 第二步:写出轮换的连乘积。
            同样的把数字盘中的数字看成是一个由左而右、由上而下的数列,以图 11 右边的归位花式而言, 可看成是下面的数列
            9, 8, 4, 7, 3, 12, 13, 10, 11, 5, 15, 1, 6, 14, 2
            由数字 1 开始检验,如果它的位置和数值不符,就要开始以下製作轮换的过程:
            这个轮换的第一个数字是数值 1,它的位置跑到位置 12 去了,记成 (1, 12
            位置 12 应该是数值 12,但它却跑到位置 6 去了,记成 (1, 12, 6
            位置 6 应该是数值 6,但它却跑到位置 13 去了,记成 (1, 12, 6, 13
            位置 13 应该是数值 13,但它却跑到位置 7 去了,记成 (1, 12, 6, 13, 7
            位置 7 应该是数值 7,但它却跑到位置 4 去了,记成 (1, 12, 6, 13, 7, 4
            位置 4 应该是数值 4,但它却跑到位置 3 去了,记成 (1, 12, 6, 13, 7, 4, 3
            位置 3 应该是数值 3,但它却跑到位置 5 去了,记成 (1, 12, 6, 13, 7, 4, 3, 5
            位置 5 应该是数值 5,但它却跑到位置 10 去了,记成 (1, 12, 6, 13, 7, 4, 3, 5, 10
            位置 10 应该是数值 10,但它却跑到位置 8 去了,记成 (1, 12, 6, 13, 7, 4, 3, 5, 10, 8
            位置 8 应该是数值 8,但它却跑到位置 2 去了,记成 (1, 12, 6, 13, 7, 4, 3, 5, 10, 8, 2
            位置 2 应该是数值 2,但它却跑到位置 15 去了,记成 (1, 12, 6, 13, 7, 4, 3, 5, 10, 8, 2, 15
            位置 15 应该是数值 15,但它却跑到位置 11 去了,记成 (1, 12, 6, 13, 7, 4, 3, 5, 10, 8, 2, 15, 11
            位置 11 应该是数值 11,但它却跑到位置 9 去了,记成 (1, 12, 6, 13, 7, 4, 3, 5, 10, 8, 2, 15, 11, 9
            位置 9 应该是数值 9,但它却跑到位置 1 去了,但因为这个轮换的起始数就是 1,所以轮换结束,记成 (1, 12, 6, 13, 7, 4, 3, 5, 10, 8, 2, 15, 11, 9)
            不包括在这个轮换的数值只剩下 14,而它恰好也在位置 14,所以不必製作另一个轮换。图 11 的归位花式轮换积就是 (1, 12, 6, 13, 7, 4, 3, 5, 10, 8, 2, 15, 11, 9) 了。
         3. 第三步:判定轮换积是偶排列或奇排列。
            把每一个轮换的元素个素减 1后相加,其和就姑且称之为长度吧!长度为偶数的轮换积叫做偶排列,长度 为奇数的轮换积就叫做奇排列。
            (1, 12, 6, 13, 7, 4, 3, 5, 10, 8, 2, 15, 11, 9) 只有一个轮换且元素个数为 14,所以长度为 13, 是奇排列。
         4. 第四步:判定。若为偶排列则有解,为奇排列则无解。
            由于图 11 对应的轮换积是奇排列,所以图 11 的随机花式无解。
            请读者自行试试,图 12 对应的轮换积为 (1, 3, 13, 4, 6, 12, 14, 8)(5, 7, 9, 10), 所以长度为 ( 8 - 1)+ ( 4 - 1 ) = 10 是偶排列,所以有解。
    * 因为我们的目的花式(顺序花式)是偶排列,所以所有有解的花式也一定是偶排列。
      如果我们的目的花式(例如逆序花式)是奇排列,则所有有解的花式也一定是奇排列。

结语

    * 以上的示范及讨论都是用一般的 4 * 4 盘面,如果改换成 n * m 的盘面时,是否也可以依样画葫芦呢? 是的,以上的方法及结论全部适用。
    * 那麽市售的实体数字盘或一般的玩法为什麽大都是採用4*4 的盘面呢?除了实体数字盘要做到任意改变大小 实在非常困难外,另一个原因就是 3 * 3 的盘面只有数字 1 的归位是简单的,其他的每一个数字要归位都 要大费思量,而 5 * 5 以上的盘面,有一半以上的数字都毫无挑战性,最右两行及最下两列虽然是比较有困难度的,但是能解决两个,就表示已掌握了移动的技巧了,再多的类似情况也可 顺利过关,所以并无意义。 4*4 的盘面难易度因此最为适中,所以大家就习以为常了。​​​​​


转自:http://home.educities.edu.tw/oddest/math1621.htm (链接已失效)
转自:http://hi.baidu.com/uehe/blog/item/35f67116c642914e20a4e917.html


推荐阅读
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
author-avatar
拍友2702936504
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有