暴力模拟
```cpp
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1000;
int t, n, p = 1;
int a[N][N], flge[N]; // 定义全局变量 t, n, p 以及二维数组a和一维数组flge
//判断行重复
bool check1() // 定义函数用来检查行是否重复
{
for(int i = 0; i < n * n; i++) { // 遍历每一行
memset(flge, 0, sizeof flge); // 清空flge数组
for(int j = 0; j < n * n; j++) { // 遍历该行的每个元素
flge[a[i][j]]++; // 统计元素出现次数
if(a[i][j] < 1 || a[i][j] > n * n) return false; // 检查元素是否在1~n*n的范围内
}
if(*max_element(flge, flge + n * n + 1) > 1) // 判断是否有重复元素
return false;
}
return true; // 若没有重复元素,返回true
}
//判断列重复
bool check2() // 定义函数用来检查列是否重复
{
for(int i = 0; i < n * n; i++) { // 遍历每一列
memset(flge, 0, sizeof flge); // 清空flge数组
for(int j = 0; j < n * n; j++) { // 遍历该列的每个元素
flge[a[j][i]]++; // 统计元素出现次数
if(a[j][i] < 1 || a[j][i] > n * n) return false; // 检查元素是否在1~n*n的范围内
}
// 加1的原因是有一个数字是n,但数组是从0开始的所以要加1
if(*max_element(flge, flge + n * n + 1) > 1) // 判断是否有重复元素
return false;
}
return true; // 若没有重复元素,返回true
}
//判断矩阵重复
bool check3() // 定义函数用来检查矩阵内是否有重复元素
{
for(int i = 0; i < n * n; i += n) { // 遍历每个小矩阵的起始行
for(int j = 0; j < n * n; j += n) { // 遍历每个小矩阵的起始列
memset(flge, 0, sizeof flge); // 清空flge数组
for(int k = i; k < i + n; k++) { // 遍历小矩阵的行
for(int p = j; p < j + n; p++) { // 遍历小矩阵的列
flge[a[k][p]]++; // 统计每个小矩阵中元素的出现次数
if(a[k][p] < 1 || a[k][p] > n * n)
return false; // 检查元素是否在1~n*n的范围内
}
}
if(*max_element(flge, flge + n * n) > 1) // 检查是否有重复元素
return false; // 如果有重复元素,返回 false
}
}
return true; // 所有小矩阵都满足要求,返回 true
}
int main()
{
cin >> t ; // 输入测试用例数量
while( p <= t) { // 对每个测试用例进行处理
cin >> n; // 输入每个小矩阵的边长
memset(a, 0, sizeof a); // 清空二维数组a
for(int i = 0; i < n * n; i++) // 遍历每个小矩阵的行
for(int j = 0; j < n * n; j++) // 遍历每个小矩阵的列
cin >> a[i][j]; // 输入小矩阵的元素
if(check1() && check2() && check3()) { // 调用三个函数来判断小矩阵是否满足条件
printf("Case #%d: Yes\n", p); // 输出结果
} else {
printf("Case #%d: No\n", p); // 输出结果
}
p++; // 更新测试用例编号
}
return 0;
}
```