求一个算法:计算4*4的拼图游戏是否有解。。。

止戈而立 2008-10-19 10:05:28
写了一个4*4的拼图游戏。。刚才自己玩了一下,发现有些情况是无解的。
比如:
01 02 03 04
05 06 07 08
09 10 11 12
13 15 14

再比如:
01 02 03 04
05 06 07 08
09 10 15 12
13 14 11

无论你怎么玩,最后都无法得到:
再比如:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15
现在想要一个算法,算出在什么情况下无法“还原”。。。
玩游戏玩到最后发现这种情况是很令人郁闷的,于是想在游戏开始前,先判断是否有解,若无解,则重新对图片进行排序。
大家帮忙想一下这个算法要怎样写。。。

其实拿2*2的来说更加简单明了:
1 2
3

如果打乱顺序后,成了下面3种情况,就无法恢复原来的顺序了:
2 1
3

3 2
1

1 3
2

在以下2种情况则可以恢复原来的排列:
3 1
2

2 3
1
...全文
1104 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmjdx 2010-06-12
  • 打赏
  • 举报
回复
不去证明不行吗?
用逆向思维。从目标图开始,让程序随机地走几步,得到的就是一个被打乱的,并且肯定可解的初始图(玩家逆着程序步法就肯定可解)。
ian123 2009-08-04
  • 打赏
  • 举报
回复

你们真无聊;
游戏开发要结合游戏性和规则本身,一个排列初始化用的着套用高数公式吗,我觉得这就是读死书
让程序随机走几步不就行了。
currenttt 2008-10-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 currenttt 的回复:]
4. 计算:
source_num = inverse_source + zero_source = 10
target_num - inverse_target + zero_target = 12
[/Quote]
这里写错了,应该是:
target_num = inverse_target + zero_target = 12
currenttt 2008-10-19
  • 打赏
  • 举报
回复
给定一个M * N的数字拼图,以3*3的数字拼图为例,将空位设为0:

source diagram:
1 3 2
6 0 5
4 7 8

target diagram:
1 2 3
4 5 6
7 8 0

方法:逆序数判断

具体说来,步骤如下:

1. 两个矩阵按照行优先转换为一维数组:
a_source[] = {1 3 2 6 0 5 4 7 8}
a_target[] = {1 2 3 4 5 6 7 8 0}

2. 计算两个数组的逆序数:
inverse_source = 8
inverse_target = 8

3. 0所在的行号和列号相加(行号、列号可以都从0算起,也可都从1算起,因为对结果无影响):
zero_source = 1 + 1 = 2
zero_target = 2 + 2 = 4

4. 计算:
source_num = inverse_source + zero_source = 10
target_num - inverse_target + zero_target = 12

5. 判断source_num 与 target_num的奇偶性。有如下结论:

两个矩阵可以相互转换 当且仅当 两个数字 的 奇偶性 相同。
上面的例子中,source_num与target_num都是偶数,所以可以相互转化,即问题是可解的。

【完毕】

LZ可以拿这个方法验证一下你给出的例子。

嗯,转载注明出处:
http://www.cppblog.com/lemene/archive/2007/10/04/33405.aspx
这个地址里面有关于这个定理的证明,不过不看也无所谓。
  • 打赏
  • 举报
回复
止戈而立 2008-10-19
  • 打赏
  • 举报
回复
比如:
01 02 03 04
05 06 07 08
09 10 11 12
13 15 14

再比如:
01 02 03 04
05 06 07 08
09 10 15 12
13 14 11

无论你怎么玩,最后都无法得到:
再比如:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧