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

原创 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为例,标注结果如: 0 1 2 3 4 5 6 7 8 我们假设最大值为空白。...
  • realmagician
  • realmagician
  • 2013年12月18日 15:02
  • 3898

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

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

合璧悦读——4-6岁儿童阅读有问必答2

上一篇我们谈到儿童阅读大家最关注的头四个问题,这一篇继续探讨: 问题5:怎样帮助孩子选书? 我们建议选三类书。第一类:有趣的书,阅读的同时能和孩子一起游戏,一起讨论,一起哈哈大笑;第二类,情感...
  • hebiikids
  • hebiikids
  • 2015年01月06日 15:04
  • 158

QT环境下实现UI界面的“拼图游戏”

main.cpp#include "mainwindow.h" #include int main(int argc, char *argv[]) { QApplication a(argc,...
  • qq_34886018
  • qq_34886018
  • 2017年06月05日 14:13
  • 1268

数三退一问题

500个人围成一圈 ,  从第一个人开始数 1,2,3  数到3的人退出,继续往下,后面的人继续数1,2,3 数到3的人就退出 , 于是这样,最后剩下一个人 这个人是几号呢?  老师讲了不同算法。 算...
  • hahawhyha
  • hahawhyha
  • 2013年10月04日 21:09
  • 1739

Android应用开发入门篇-拼图游戏

前一段时间为了学习android应用开发,尝试写了个简单的拼图应用,在此记录下实现流程的核心部分,同时也希望给其他开发者入门参考带来帮助。 1. 基本的界面设计     首先应该设计出各个...
  • u010666109
  • u010666109
  • 2014年04月01日 20:38
  • 1877

qt拼图游戏

拼图效果图 #ifndef WIDGET_H #define WIDGET_H #include #include #include class Frame; enum Level{ ...
  • qq_33200959
  • qq_33200959
  • 2017年08月09日 19:48
  • 830

50个人围成一圈数数,数到3的人退出,求最后剩下的人的编号

package com.hjh; public class lianbiao { /** * 链表,50个人围城一个圈,数到三的退出,求最后剩下的人是哪一个 * @param args ...
  • lv_cha1
  • lv_cha1
  • 2013年02月22日 11:18
  • 3597

【Demo】拼图小游戏 winform (二) 只能在空格区域移动的拼图

与第一篇一样,同属简单Demo,这个在开始做的时候,想的是将PictureBox拖动到另一个PictureBox上,如果PictureBox没图片,就将Image传递,但想法是简单的,事实是复杂的:首...
  • starfd
  • starfd
  • 2015年04月03日 23:18
  • 3540

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

今天看Android,看到一个开源库android-FlipView,然后看着看着就绕到了拼图游戏上,现在我打算写一个简单的拼图游戏。这将是我第二个连载的系列文章,今天是第一天,简单的用java命令行...
  • u011638883
  • u011638883
  • 2013年12月03日 18:32
  • 2476
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从拼图游戏开始(三)_可行解的讨论
举报原因:
原因补充:

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