loj#P4040. 「SNOI2024」拉丁方

「SNOI2024」拉丁方

题目描述

我们定义一个 n×nn \times n 的矩阵 AA 为拉丁方,当且仅当,每行每列都是一个 1n1 \sim n 的排列。

现在给你一个矩阵 AA 左上角的一个 R×CR \times C 的子矩阵,也就是 Ai,j(1iR,1jC)A_{i, j} (1\leq i\leq R, 1\leq j \leq C)。问能不能将剩下的位置填上数使得它是一个拉丁方。

输入格式

多组测试数据,第一行一个整数 TT 表示测试数据组数。

对于每组测试数据,第一行三个整数 n,R,Cn, R, C 表示矩阵大小和已知的矩阵大小。

接下来 RR 行,每行 CC 个数,其中第 ii 行的第 jj 个数表示 Ai,jA_{i, j}

输出格式

对于每组数据,第一行输出一个字符串 Yes 或者 No,表示能否找到满足条件的拉丁方。

如果能找到满足条件的拉丁方,那么在接下来 nn 行,每行输出 nn 个数,表示一个满足条件的拉丁方。如果有多组满足条件的方案,输出任意一种即可。

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

对于第二组数据,根据前两行可以发现,A1,3=A2,3=3A_{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}$$

数据范围与提示

对于所有的数据,保证 1T101\leq T \leq 10, 1n5001 \leq n \leq 500, 1R,Cn1\leq R, C \leq n, 1Ai,jn1\leq A_{i, j} \leq n,保证输入的子矩阵不存在一行或者一列有两个相同的数。

具体如下:

测试点编号 nn\leq 特殊性质
121\sim2 66
343\sim4 1010
55 500500 A
676\sim7 100100 B
898\sim9 300300
1010 500500
111211\sim12 C
131413\sim14 100100
151615\sim16 300300
172017\sim20 500500

特殊性质 A:保证 R=1R = 1

特殊性质 B:保证 C=nC = n

特殊性质 C:保证 R,Cn2R, C \leq \frac{n}{2}