我们定义一个 n \times n 的矩阵 A 为拉丁方,当且仅当,每行每列都是一个 1 \sim n 的排列。
现在给你一个矩阵 A 左上角的一个 R \times C 的子矩阵,也就是 A_{i, j}(1 \le i \le R,1 \le j \le C)。问能不能将剩下的位置填上数使得它是一个拉丁方。
多组测试数据,第一行一个整数 T 表示测试数据组数。
对于每组测试数据,第一行三个整数 n, R, C 表示矩阵大小和已知的矩阵大小。
接下来 R 行,每行 C 个数,其中第 i 行的第 j 个数表示 A_{i, j}。
对于每组数据,第一行输出一个字符串 Yes
或者 No
,表示能否找到满足条件的拉丁方。
如果能找到满足条件的拉丁方,那么在接下来 n 行,每行输出 n 个数,表示一个满足条件的拉丁方。如果有多组满足条件的方案,输出任意一种即可。
3 2 1 1 1 3 2 2 1 2 2 1 5 2 3 1 2 3 4 3 2
Yes 1 2 2 1 No Yes 1 2 3 4 5 4 3 2 5 1 2 4 5 1 3 3 5 1 2 4 5 1 4 3 2
【样例 #1 解释】
在第一个样例中,对于第二组数据,根据前两行可以发现,$A{1, 3} = A{2, 3} = 3$,所以不存在满足条件的拉丁方。
对于第三组数据,可以发现输出是一个满足条件的拉丁方,并且左上角是输入的矩阵。下面也是一个满足条件的方案。 \begin{bmatrix} 1 & 2 & 3 & 5 & 4 \ 4 & 3 & 2 & 1 & 5 \ 3 & 5 & 1 & 4 & 2 \ 2 & 4 & 5 & 3 & 1 \ 5 & 1 & 4 & 2 & 3 \end{bmatrix}
【样例 #2】
见附件中 latin/latin2.in
与 latin/latin2.ans
,这个样例满足测试点 6 \sim 7 的条件限制。
【样例 #3】
见附件中 latin/latin3.in
与 latin/latin3.ans
,这个样例满足测试点 11 \sim 12 的条件限制。
【数据范围】
对于所有的数据,保证 1 \le T \le 10,1 \le n \le 500,1 \le R, C \le n,1 \le A_{i, j} \le n,保证输入的子矩阵不存在一行或者一列有两个相同的数。
具体如下:
测试点编号 | n \le | 特殊性质 |
---|---|---|
1 \sim 2 | 6 | 无 |
3 \sim 4 | 10 | 无 |
5 | 500 | A |
6 \sim 7 | 100 | B |
8 \sim 9 | 300 | B |
10 | 500 | B |
11 \sim 12 | 500 | C |
13 \sim 14 | 100 | 无 |
15 \sim 16 | 300 | 无 |
17 \sim 20 | 500 | 无 |
特殊性质 A:保证 R = 1。
特殊性质 B:保证 C = n。
特殊性质 C:保证 R, C \le \frac{n}{2}。
陕西省选