#pAIXUlydlt00x0506. 奇数码问题

奇数码问题

奇数码问题可达性判断

题目描述

你一定玩过八数码游戏,它实际上是在一个 3×33 \times 3 的网格中进行的,11 个空格和 181 \sim 888 个数字恰好不重不漏地分布在这 3×33 \times 3 的网格中。

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

奇数码游戏是它的一个扩展,在一个 n×nn \times n 的网格中进行,其中 nn 为奇数,11 个空格和 1n211 \sim n^2 - 1n21n^2 - 1 个数恰好不重不漏地分布在 n×nn \times n 的网格中。

空格移动的规则与八数码游戏相同,实际上,八数码就是一个 n=3n = 3 的奇数码游戏。

现在给定两个奇数码游戏的局面,请判断是否存在一种移动空格的方式,使得其中一个局面可以变化到另一个局面。

输入格式

多组数据,对于每组数据:

11 行输入一个整数 nnnn 为奇数。

接下来 nn 行每行 nn 个整数,表示第一个局面。

再接下来 nn 行每行 nn 个整数,表示第二个局面。

局面中每个整数都是 0n210 \sim n^2 - 1 之一,其中用 00 代表空格,其余数值与奇数码游戏中的意义相同,保证这些整数的分布不重不漏。

输出格式

对于每组数据,若两个局面可达,输出 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

限制条件

  • 1n<5001 \le n < 500
  • nn 为奇数
  • 每组数据保证局面中的整数 0n210 \sim n^2 - 1 恰好出现一次

可达性判断原理

对于奇数码问题(nn 为奇数),两个局面可达的充分必要条件是:将两个局面的数字(不包括 00)按行优先顺序展开成一维序列后,两个序列的逆序对数量的奇偶性相同

具体判断方法:

  1. 将每个 n×nn \times n 矩阵去掉空格(00)后,按行优先顺序展开成一个长度为 n21n^2 - 1 的序列
  2. 计算每个序列的逆序对数量
  3. 如果两个序列的逆序对数量的奇偶性相同,则两个局面可达,输出 TAK
  4. 否则,输出 NIE

样例解释 #1

第一组数据(n=3n = 3

第一个局面:

1 2 3
0 4 6
7 5 8

去掉 00 后序列:[1,2,3,4,6,7,5,8][1, 2, 3, 4, 6, 7, 5, 8] 逆序对:(7,5)(7, 5) → 1个逆序对

第二个局面:

1 2 3
4 5 6
7 8 0

去掉 00 后序列:[1,2,3,4,5,6,7,8][1, 2, 3, 4, 5, 6, 7, 8] 逆序对:0个

两个序列的逆序对数量都是偶数(1是奇数,0是偶数?这里需要修正:1是奇数,0是偶数,奇偶性不同?实际上判断有误,需要仔细计算)

实际上对于 3×33 \times 3 的八数码问题,应该计算整个 3×33 \times 3 网格展开后(包括 00)的逆序对,然后判断奇偶性。但题目已经说明 nn 为奇数时只需考虑去掉 00 后的序列。

第二组数据(n=1n = 1

两个局面都是 [0][0],显然可达。

注:对于 n=1n = 1 的情况,只有空格,两个局面总是可达的。