从拼图游戏开始(三)_可行解的讨论

原创 2013年12月19日 07:21:25

讨论一下拼图游戏(算法中的名称是15puzzle)中可行解的问题,实际上随机生成的15puzzle大约有%50是无解的,本文将就随机生成的谜题的可解性加以讨论。

设有如下矩阵:

12   1   10    2

7    11   4    14

5     x    9    15

8    13    6    3

将其排成水平的,有:12,1,10,2,7,11,4,14,5,X,9,15,8,13,6,3。并记该序列为A

定义:”倒置变量值“ TTi表示序列A中位于第i位之后比Ai小的元素的个数

也就是说上面的序列的倒置变量值分别是:11,0,8,0,4,6,1,6,1,3,4,2,2,1。求和,得到总的Tsum = 49。

那么有如下几个原则来判断当前问题是否有解:

设:问题宽度为W

设:问题的倒置变量和为T

一、对于一个W为奇数的问题来说,任何合法的移动都不会改变其"倒置变量值"的奇偶性。

证明:>>水平移动式不会改变问题的T

           >>垂直移动,意味值blank跨越了(W-1)个方格,由于问题宽度W是奇数的,那么(W-1)必定为偶数,再设这W-1个数中有n个数大于当前移动数,则有(W-1-n)个数小于当前移动数,那么移动后,带来的T的改变是:(W-1-n)-n=W-1-2n,因为W-1是偶数,则W-1-2n也必为偶数,说明问题的T的奇偶性不变。

二、当W为偶数时,有以下公式:(T是偶数) == (空格位于从矩阵底部往上数的奇数行中)

证明:>>水平移动式不会改变问题的T

           >>垂直移动,意味值blank跨越了(W-1)个方格,由于问题宽度W是偶数的,那么(W-1)必定为奇数,再设这W-1个数中有n个数大于当前移动数,则有(W-1-n)个数小于当前移动数,那么移动后,带来的T的改变是:(W-1-n)-n=W-1-2n,因为W-1是奇数,则W-1-2n也必为奇数,说明问题的T的奇偶性会交替变化,但是空格位置也在交替变化,这种变化也符合上面定义的公式。

OK,有了上面两个定理,我们可以推论出一下可行解原则

1、如果问题宽度是奇数的,那么每个可解的问题所定义的T必须是偶数的。

2、如果问题宽度是偶数的,那么当空格位于从下往上数的奇数行中时,问题的T必须是偶数的;当空格位于从下往上数的偶数行中时,问题的T必须是奇数的。

 

参考文档:http://www.cs.bham.ac.uk/~mdr/teaching/modules04/java2/TilesSolvability.html

相关文章推荐

拼图游戏可解性判断,自动生成可解拼图

拼图游戏都玩过, 对于一个n*m的拼图游戏,我们将按照从左到右,从上到下的顺序给每个分格标注,可得一个二维矩阵。以3*3为例,标注结果如: [html] view plain ...

拼图游戏可解性判断,自动生成可解拼图

拼图游戏都玩过, 对于一个n*m的拼图游戏,我们将按照从左到右,从上到下的顺序给每个分格标注,可得一个二维矩阵。以3*3为例,标注结果如: 0 1 2 3 4 5 6 7 8 我们假设最大值为空白。...

拼图游戏也有拼不出的坑(二)

考虑N*M的拼图。 当N=M=2,穷举法可证明只有两组等价类。当N,M不同时为2时,设N不等于2(如果N等于2,M不等于2可颠倒行列讨论)。只考虑第二行最后一个元素是空元素的情形,因为空元素在其他位...

自动解决智能拼图,A*算法

接上一篇博客 生成可解的智能拼图后(具体方法参见: http://blog.csdn.net/realmagician/article/details/17395035)就要想办法找到自动解决的...

J2ME 拼图游戏 快速开发 全过程 之代码祥解(5 )——记录集操作类、序列的奇偶性检查类

记录集操作类,代码: package cn.edu.xtu.tilepuzzle.model; import java.io.ByteArrayInputStream; import j...

从拼图游戏开始(九)_界面优化及功能完善

今天来优化一下游戏界面,因为笔者希望做出来的东西能够有人会去参考或者使用。这个版本完善了一下界面,最终效果和最初的手稿设计有所不同,因为使用了ActionBar,又改了一些细节。同时也修复了上一版中快...

从拼图游戏开始(八)_功能完善

好几天没写博客了,今天继续扯拼图游戏。话说上次(从拼图游戏开始(七)_数据模块框架实现)实现了问题数据的持久化,任意长宽比图片的自动剪裁等功能。这次要完善以下功能: 1.添加自定义图片来...

J2ME 拼图游戏 快速开发 全过程 之代码祥解(4 )——图片操作类、图片预览后处理类

图片操作类(转自网上),代码: package cn.edu.xtu.tilepuzzle.model; import javax.microedition.lcdui.Font; im...

从拼图游戏开始(一)_简单java模拟

今天看Android,看到一个开源库android-FlipView,然后看着看着就绕到了拼图游戏上,现在我打算写一个简单的拼图游戏。这将是我第二个连载的系列文章,今天是第一天,简单的用java命令行...

用逆序数的奇偶性来判断数字拼图游戏的解的存在性问题

原帖链接:http://topic.csdn.net/u/20080926/23/301801ca-2fe0-4d24-84e3-fbd454be4604.html?291383689 有一个3...
  • kaikai4
  • kaikai4
  • 2016年05月16日 17:57
  • 812
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从拼图游戏开始(三)_可行解的讨论
举报原因:
原因补充:

(最多只允许输入30个字)