首页 > 代码库 > 拼图问题可解性探究
拼图问题可解性探究
一.拼图问题定义
给定一个m*n的平面格点图,只有一个空位,其余各点内为1~m*n-1的数字.目标就是从左到右,从上到下依次排成从1到m*n-1,空位在最后一格内.
二.逆序数定义
从左到右,从上到下,各个格点内的数字形成一个序列,这个序列的逆序数就是当前状态的逆序数.
三.操作定理
对于一个状态,可以将空格与其上下左右4个位置的卡片交换位置.左右交换不影响状态的逆序数,这是显然易见的.
上下交换,相当于多次交换.当列数为奇数,上下交换相当于交换偶数次,奇偶性不变;当列数为偶数,上下交换相当于交换奇数次,奇偶性变化.
所以,操作是否影响奇偶性取决于列数的奇偶性.
四.目标状态的奇偶性
目标状态是什么至关重要.例如3*3的八数码问题目标状态的逆序列为1,2,3,4,5,6,7,8.逆序数为(7+1)*7/2=28,为偶数.而根据操作定理,在3*3问题中操作不影响逆序数的奇偶性,所以初始状态的逆序数就决定了3*3问题是否有解.
那么存不存在目标状态逆序数为奇数的问题呢?存在.比如3*4问题,目标状态为1,2,3,4,5,6,7,8,9,10,11.逆序数为10*(10+1)=55,为奇数.根据操作定理,3*4为3行4列,上下交换影响奇偶性.对于3*4问题是否有解,有如下结论:
当初始状态逆序数为奇数时,只有空位在第一行或者第三行时才有解.
当初是状态逆序数为偶数时,只有空位在第二行才有解.
因为上下交换逆序数翻个.
五.拼图问题可解性定理
知道目标状态,知道操作过程,就足以攻克一切问题.
目标状态有两种:(1)逆序数为偶数;(2)逆序数为奇数.
操作与奇偶性的关系有两种:左右交换始终不影响奇偶性.(1)列数为奇数,上下交换不影响奇偶性;(2)列数为偶数,上下交换影响奇偶性.
于是结论是,当列数为奇数时,一切操作不影响奇偶性,只要当前状态逆序数奇偶性与目标状态逆序数奇偶性一致就有解.
当列数为偶数时,上下交换影响奇偶性,只要当前状态逆序数奇偶性+当前空格状态的奇偶性 跟 目标状态逆序数奇偶性一致就有解.
六.应用
生成拼图问题时,关键是要保证拼图有解.
有两种方案:方案一,从初始目标状态触发,经过一系列随机操作(上下左右)就会得到一个混乱结果;
方案二,按照上述定理,构造一个序列,这个序列的奇偶性要注意调整,然后将空位插入到这个序列中去,使得这个状态可解.
在拼图规模较小的情况下,两种方案都可行;在拼图规模较大的情况下,方案一空格走不了几步,导致很多格点跟目标状态相差无几.而方案二依旧能够保持足够高的随机性.
拼图问题可解性探究