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

原创 2008年09月30日 13:34:00

原帖链接:http://topic.csdn.net/u/20080926/23/301801ca-2fe0-4d24-84e3-fbd454be4604.html?291383689

有一个3*3的矩阵,里面分别填着数字0~8,填入的时候是随机的,要求每次只能用0和和边上的一个数字交换,最终实现所要求的数字排列。
如:
随机真数字矩阵为:
1 3 5
0 2 6
4 7 8  0,可以与1,2,4交换
最终变成目标矩阵
1 2 3
8 0 4
7 6 5
中间可进行无限次0与其他数字的交换。
问:
任意给一个数字矩阵,能否证明:经过无限次的交换,一定能到达目标矩阵或者经过无限的交换也不能实现目标矩阵?
如果没说清楚,请跟贴
解决问题,再追加300分

 

这是一个3*3的数字拼图游戏;

考虑更一般化的问题:对于两任意排列的m*n的数字矩阵(两矩阵包含有相同的元素,都为分别为0--n*m-1,但排列顺序不同)A与B,如何判断A能否经过一系列的合法的移动(每次只能用0和和边上的一个数字交换),转换成B;

 

这是一个经典的问题,用逆序数的奇偶性来判断数字拼图游戏的解的存在性也早有定论;

但我没找到详细的证明;因此自己尝试给出一个通俗的证明;请各位指正!

 

定义:

序列:m*n的数字矩阵的m*n个元素的排列方式有(m*n)!种;指定一种排列规则后,m*n的数字矩阵可以得到一个对应的序列(序列中包含有元素0);

以下的讨论中的提到的序列都假定遵循某同一种排列规则,但不局限于任何特定的排列规则;

 

引理1交换序列的任意两元素,序列的逆序数的奇偶性必定发生改变;

这是教科书上的定理,不再赘述;

 

从定理1,交换1次改变奇偶性,再交换再次改变奇偶性,所以连续交换2次,序列的逆序数的奇偶性必定保持不变;所以有

推论1:对序列进行偶数次的交换,序列的逆序数的奇偶性保持不变;

 

推论2: "对于任意的m*n的数字矩阵,经过任意k次合法移动后,若0回到原来的位置,那么序列的逆序对的奇偶性保持不变"
1)由于每次合法移动都是跟0进行的,总的移动次数 ==0的移动次数总计;
2)对于数0,由于其位置保持不变,那么必定需要经过偶数次的左右移动,以及偶数次的上下移动;
由推论1, 所以推论2得证;

 

推论3: "对于任意的m*n的数字矩阵,假设经过多次合法移动后,交换了两非0元素的位置,且其他元素的位置保持不变,那么必定需要经过与0偶数次的左右交换,以及偶数次的上下交换";
由于交换前后0的位置保持不变,由推论2,推论3得证;


然而从引理1:交换序列的任意两元素,序列的逆序数的奇偶性必定发生改变;

这与推论3是相互矛盾的,所以推论3的假设是不存在的;

推论4: "对于任意的m*n的数字矩阵,无法经过任意次的合法移动,使得:交换了两非0元素的位置,且其他元素的位置保持不变"; 即:若A与B只有两非0元素的位置不一致,其他的(包含0)元素的位置是相同的,那么A不能通过合法移动转化成B;

 

下面来讨论一个具体的移动策略;
对于任意的m*n的矩阵,不妨假设行m>=列n;
假设源状态矩阵为A,目标状态矩阵为B;

1) 总能将目标状态B的0移动到左上角的位置;
  将新的目标状态记为B',由于每步移动都是可逆的,所以从B可以移动到B',那么必定也可以从B'移动到B;
  因此,A能否移动到B 等价于 A能否移动到B';
2) 若m>n,那么总可以移动A 使得 A的最后一行与B'的最后一行的元素与位置完全相同;
  假设B'的最后一行的元素从左到右依次为B'[1..n];
  a) 对于A中的B'[1],总可以将该元素先移动到目标位置的上方;然后依次移动使得其下方目标位置为0;再交换 B'[1]与 0,即可将A中的B'[1]移动到目标位置;
  b) 假设A的最后一行的前i个元素已放置完毕,那么对于第i+1 <n个元素,总可以用与a)同样的方法,将A中的B'[i+1]移动到目标位置;
  c) 对于A中的B'[n],先将其移动到A的倒数第2行的倒数第2列,然后将0移动到A中的B'[1]的 上方,再将B'[1..n-1]各顺时针移动一个位置;将B'[n] 下移,然后再将B'[1..n]各逆时针移动一个位置;
  这样就完成了 "移动A 使得 A的最后一行与B'的最后一行的元素与位置完全相同"
  记 A的前m-1行组成的子矩阵为A',B'的前m-1行组成的子矩阵为新B'

  那么循环执行 2) 直到 A'的行数与列数相同;

3) 若A'的行数与列数相同,那么总可以移动A' 使得 A'的最后一行与最后一列与B'的最后一行与的元素与位置完全相同;
  略,方法类似与2);

  那么循环执行 3),直到 A'的行数与列数都为2;

4) 对于2*2的矩阵A' 与B',设 B'中的0的对角位置的元素为c,那么总可以按照顺(或者逆)时针移动A',c移动到正确的位置,然后移动0到正确位置;
  那么可以得到两个不同的状态;
  A) 若 A'的另两位置的元素与B'的对应位置的元素一模一样,即 A'==B',记此情况的A'为B1(B1==A'==B');
      由移动的可逆性, 那么源状态矩阵A必定可以移动到目标状态矩阵B;
  B) 若 A'的另两位置的元素与B'的对应位置的元素不一样,即 该两位置的元素是颠倒的,记此情况的A'为B2;

由于B1与B2相比,除两位置的元素的位置互换外,其他元素的位置一致;
由推论4,可以得到 B1与B2是不能相互转化的;

所以有

推论5: 对于任意的特定的目标状态B,所有的源状态A可以分成不相交的两类,一类可以转化成B1(即A可以转化成B),一类可以转化成B2(即A不可以转化成B);     


将源状态A中的0移动到左上角,得到新的A',那么A'与B'的0的位置是相同的;

 
对于A',必定要么可以转换到B1,要么可以转换到B2; 但A',B1,B2其0的位置是相同的,由推论2:其序列的逆序对的奇偶性保持不变; 又B1,B2的 逆序对的奇偶性是不同;


所以有最终的结论:

对源状态A与目标状态B进行规范化,使得两矩阵的元素0的位置相同;记为新的源状态A'与目标状态B';
若A'与B'的逆序对的奇偶性相同(即A'与B1的逆序对的奇偶性相同),则A'必定可能转化为B',即A可以转化到B;
若A'与B'的逆序对的奇偶性不同(即A'与B2的逆序对的奇偶性相同),则A'必定不可能转化为B',即A不可以转化到B;

 

 

 

 

 

 

 

数字拼图问题(八数码)求解过程动态演示

本文转自: http://www.qqgb.com/Program/VC/VCarithmetic/Program_55328.html   一、题目说明:   在一个3×3的九宫中有1...
  • WOSHICAIXIANFENG
  • WOSHICAIXIANFENG
  • 2012年07月19日 20:30
  • 1342

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

4X4数字拼图,也被叫做「移动十五」、「十五子棋」、「十五子迷」、「数字智慧盘」等。...
  • cuixiping
  • cuixiping
  • 2010年12月15日 12:31
  • 10599

拼图游戏的数学原理

一、线性代数基础知识 1、逆序的定义:         逆序是一个与排列相关的概念。         由自然数1,2…,n组成的不重复的每一种有确定次序的排列,称为一个n级排列(简称为排列);或者一般...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2014年01月10日 14:21
  • 2281

Java中判断数字的奇偶性

方法一:常规方法if…else import java.util.Scanner; public class ParityCheck {//类 public static void main(...
  • guwuyue
  • guwuyue
  • 2015年12月18日 16:21
  • 1168

关于两个数字顺序颠倒函数的几种常见错误

在我没学指针之前,编写两个数字颠倒的这个函数时,我感觉没有太大的问题,但是老师给我们讲了指针的相关的知识后,这个函数的问题就出现了以下问题: (前提是不允许在函数中使用打印函数)第一个函数一直到第三...
  • jinniananhao_1
  • jinniananhao_1
  • 2017年11月25日 18:01
  • 62

IDA*算法实现的数字拼图游戏

本篇文章主要受到了“华都烟梦” 同学的启发,看了他的博客和代码之后,我自己研究了很久,后来发现了一种时间上比较能够接受的方法,实现了这个拼图的机器求解。 详细参见:http://blog.csdn.n...
  • bywuu
  • bywuu
  • 2016年11月21日 13:03
  • 331

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

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

如何判断两个数字的奇偶性是否相同。

var a = parseInt(prompt("请输入第一个数字")); var b = parseInt(prompt("请输入第二个数字")); if(a%2 == 0 && b%2 == 0)...
  • qq_21109153
  • qq_21109153
  • 2016年04月06日 20:35
  • 275

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

原帖链接:http://topic.csdn.net/u/20080926/23/301801ca-2fe0-4d24-84e3-fbd454be4604.html?291383689 有一个3...
  • kaikai4
  • kaikai4
  • 2016年05月16日 17:57
  • 1030

算法实现将一个输入的数字颠倒(输入12345->54321)

#include char *change(char *str) { int length=strlen(str); int i; char flag; for(i=0;i
  • WANGYAN9110
  • WANGYAN9110
  • 2012年03月20日 23:45
  • 2523
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用逆序数的奇偶性来判断数字拼图游戏的解的存在性问题
举报原因:
原因补充:

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