#pAIXUlydlt00x0506. 奇数码问题
奇数码问题
奇数码问题可达性判断
题目描述
你一定玩过八数码游戏,它实际上是在一个 的网格中进行的, 个空格和 这 个数字恰好不重不漏地分布在这 的网格中。

在游戏过程中,可以把空格与其上、下、左、右四个方向之一的数字交换(如果存在)。

奇数码游戏是它的一个扩展,在一个 的网格中进行,其中 为奇数, 个空格和 这 个数恰好不重不漏地分布在 的网格中。
空格移动的规则与八数码游戏相同,实际上,八数码就是一个 的奇数码游戏。
现在给定两个奇数码游戏的局面,请判断是否存在一种移动空格的方式,使得其中一个局面可以变化到另一个局面。
输入格式
多组数据,对于每组数据:
第 行输入一个整数 , 为奇数。
接下来 行每行 个整数,表示第一个局面。
再接下来 行每行 个整数,表示第二个局面。
局面中每个整数都是 之一,其中用 代表空格,其余数值与奇数码游戏中的意义相同,保证这些整数的分布不重不漏。
输出格式
对于每组数据,若两个局面可达,输出 TAK,否则输出 NIE。
输入输出样例 #1
输入 #1
3
1 2 3
0 4 6
7 5 8
1 2 3
4 5 6
7 8 0
1
0
0
输出 #1
TAK
TAK
输入输出样例 #2
输入 #2
3
1 2 3
4 5 6
7 8 0
1 2 3
4 5 6
0 7 8
输出 #2
NIE
限制条件
- 为奇数
- 每组数据保证局面中的整数 恰好出现一次
可达性判断原理
对于奇数码问题( 为奇数),两个局面可达的充分必要条件是:将两个局面的数字(不包括 )按行优先顺序展开成一维序列后,两个序列的逆序对数量的奇偶性相同。
具体判断方法:
- 将每个 矩阵去掉空格()后,按行优先顺序展开成一个长度为 的序列
- 计算每个序列的逆序对数量
- 如果两个序列的逆序对数量的奇偶性相同,则两个局面可达,输出
TAK - 否则,输出
NIE
样例解释 #1
第一组数据()
第一个局面:
1 2 3
0 4 6
7 5 8
去掉 后序列: 逆序对: → 1个逆序对
第二个局面:
1 2 3
4 5 6
7 8 0
去掉 后序列: 逆序对:0个
两个序列的逆序对数量都是偶数(1是奇数,0是偶数?这里需要修正:1是奇数,0是偶数,奇偶性不同?实际上判断有误,需要仔细计算)
实际上对于 的八数码问题,应该计算整个 网格展开后(包括 )的逆序对,然后判断奇偶性。但题目已经说明 为奇数时只需考虑去掉 后的序列。
第二组数据()
两个局面都是 ,显然可达。
注:对于 的情况,只有空格,两个局面总是可达的。