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