3X3拼图的可解性
来源:互联网 发布:javascript复选框全选 编辑:程序博客网 时间:2024/05/16 12:06
几个定义:
1、逆序数
例如: 1 2 3 5 4,逆序数有1对,54
5 4 3 2 1,逆序数有10对,54,53,52,51,43,42,41,32,31,21
2、奇排列偶排列
一个排列,逆序数总数为奇数则为奇排列,否则为偶排列。
例如上面的两个排列:12354位奇排列,54321为偶排列。
3、关于奇排列和偶排列的定理
偶排列任意交换两个数形成奇排列,奇排列任意交换两个数形成偶排列。
拼图的可解性(一个随机拼图一半无解):
假设3*3的拼图为0-8的数字,0表示可以交换的空白块,123456780为最终状态。显然123456780为偶排列,0所在的位置为偶位置。
那么,有两种方式可以判断拼图是否可解:
(1)判断整个序列是奇排列还是偶排列,再判断0的位置是奇位置还是偶位置,如果前两者的奇偶性相同则有解。
说明:初始状态123456870为奇排列,0所在的位置为偶位置。每次移动必然导致0的位置奇偶性和整个排列的奇偶性变化一次,因此无论如何都不可能移动到123456780整个最终排列和0的位置都为偶的状态。
(2)序列里面排除空白块0,判断序列是奇排列还是偶排列。如果是偶排列,则可以完成。
说明:因为排除0,所以0每次和附近的交换都不影响奇偶性,所以最初为奇排列,怎么都移动不成偶排列。
伪代码(c):
/* 第一种实现 */
map[9];
cnt = 0;
/* 计算逆序数总数 */
for(i = 0; i < 8; i++)
for(j = i + 1; j < 9; j++)
{
if(map[i] > map[j])
cnt++;
}
/* 判断空白块0的位置 */
for(i = 0; i < 9; i++)
{
if(map[i] == 0)
break;
}
if(cnt % 2 != i % 2) //奇偶性不同则无解
{
//无解
}
/* 第二种实现 */
map[9];
cnt = 0;
/* 计算逆序数总数 */
for(i = 0; i < 8; i++)
for(j = i + 1; j < 9; j++)
{
if(map[i] > map[j] && map[j] != 0) //排除空白块0
cnt++;
}
if(cnt % 2) //奇排列则无解
{
//无解
}
怎么把无解的拼图变为有解?
任意交换两个非空白块的位置就能让拼图从无解变为有解。
4X4拼图也一样吗?
不一样,从第一种方法的分析可知。空白块的移动会导致奇偶位置变化一次,因为3X3的奇偶位置如下
0 1 0
1 0 1
0 1 0
而4X4的不一样了,如下
0 1 0 1
0 1 0 1
0 1 0 1
0 1 0 1
这样,上下移动,空白块位置的奇偶性不变,会导致需要重新分析可解性。
参考:http://www.guokr.com/question/579400/
0 0
- 3X3拼图的可解性
- java拼图3x3
- 3X3智力拼图技巧
- 拼图3x3最短路径
- 大学生职业选择的3X3
- 程序员的“拼图”游戏
- 不可还原的拼图
- 不可还原的拼图
- 漂亮的字符拼图
- 好友拼图的原理
- 不可还原的拼图
- Cocos2d-x3.3的的颜色混合BlendFunc
- 3x3矩阵的转置
- 拼图
- 拼图
- 拼图
- 拼图
- 拼图
- java生成二维码
- jdk安装与环境变量配置
- java.util.AbstractSet学习笔记
- ios Protocol buffer安装
- Hibernate逆向工程(表--->对象)
- 3X3拼图的可解性
- LeetCode No.168 Excel Sheet Column Title
- 通过remoteViews自定义Notification通知栏的布局
- Spark1.6的RPC
- Ubuntu16.04 中mongodb数据库
- bitbake简单的helloworld expamle
- HashMap剖析
- C++中用const限定类的成员函数
- 可积的判定(充分条件,必要条件)