二维拼图 无解的可能

几天看到一个博友写的二维拼图的程序(python游戏开发实战:三阶拼图),讨论到二维拼图可能无解。
二维拼图是一个比较经典的游戏,其实这个我开始没有太注意这个问题,博友提出我就想了一下。


先做一波分析:

其实在这个规则的拼图过程中,最小运动单元是2×2,最后的空缺一般设在右下角,所以右下角的自由度最大。
在这里插入图片描述
在 右下角 之外 的都是可以自由拼接的,一般拼图是从左上角先下手,熏熏渐近的向右下角逼近。

所以拼图是否有解,最终落在最后右下角的2×2的顺序是否是正解。
如上3×3的阵列中,最后就是看右下角最后是否能够拼出:
在这里插入图片描述
我推了一下,其实最后就是看6和8相对于5的位置。如果逆时针为658的循环,那应该就可以,如果是856就无解。

但是568如果不在最后几格,在其他的地方,其实推算起来相对就比较复杂了。不过在这个基础上应该还是可以推算。


好了,就是即时起兴而已,先就这样了,如果有兴趣,欢迎交流,和进一步讨论。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
九宫格拼图无解是指在给定的初始状态下,无论怎样移动拼图块,都无法还原成目标状态。在Java中,可以通过以下步骤来判断九宫格拼图是否有解: 1. 首先,将九宫格拼图表示为一个一维数组,其中每个元素代表一个拼图块的编号,0表示空白块。 2. 计算初始状态中空白块所在行的逆序数之和,即空白块下方的所有拼图块比上方的拼图块多的个数。 3. 如果初始状态的行数为奇数,则逆序数之和为偶数时,九宫格拼图有解;逆序数之和为奇数时,九宫格拼图无解。 4. 如果初始状态的行数为偶数,则逆序数之和加上空白块所在行的行号为奇数时,九宫格拼图有解;逆序数之和加上空白块所在行的行号为偶数时,九宫格拼图无解。 下面是一个示例代码,用于判断九宫格拼图是否有解: ```java public class PuzzleSolver { public static boolean isSolvable(int[] puzzle) { int inversions = countInversions(puzzle); int blankRow = getBlankRow(puzzle); int size = (int) Math.sqrt(puzzle.length); if (size % 2 == 1) { return inversions % 2 == 0; } else { return (inversions + blankRow) % 2 == 1; } } private static int countInversions(int[] puzzle) { int inversions = 0; int size = puzzle.length; for (int i = 0; i < size - 1; i++) { for (int j = i + 1; j < size; j++) { if (puzzle[i] != 0 && puzzle[j] != 0 && puzzle[i] > puzzle[j]) { inversions++; } } } return inversions; } private static int getBlankRow(int[] puzzle) { int size = (int) Math.sqrt(puzzle.length); for (int i = 0; i < puzzle.length; i++) { if (puzzle[i] == 0) { return size - i / size; } } return -1; } } ``` 使用示例: ```java int[] puzzle = {1, 2, 3, 4, 5, 6, 8, 7, 0}; boolean solvable = PuzzleSolver.isSolvable(puzzle); System.out.println("Is puzzle solvable? " + solvable); ``` 输出结果: ``` Is puzzle solvable? true ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值