本题纯烦。
鉴于数据范围比较小,按题意模拟即可。
依次检查每一行,每一列和每一个子矩阵是否符合要求。
注意多测和题目要求的格式化输出。
AC Code
cpp
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int MAXN = 45;
int tmp, n, a[MAXN][MAXN];
bool vis[MAXN];
bool check() {
int sz = n;
int blk = tmp;
// 1. 检查每一行
for (int i = 1; i <= sz; i++) {
memset(vis, 0, sizeof(vis));
for (int j = 1; j <= sz; j++) {
int num = a[i][j];
if (vis[num]) return false;
vis[num] = true;
}
}
// 2. 检查每一列
for (int j = 1; j <= sz; j++) {
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= sz; i++) {
int num = a[i][j];
if (vis[num]) return false;
vis[num] = true;
}
}
// 3. 检查每一个子矩阵
for (int i = 1; i <= sz; i += blk) {
for (int j = 1; j <= sz; j += blk) {
memset(vis, 0, sizeof(vis));
for (int dx = 0; dx < blk; ++dx) {
for (int dy = 0; dy < blk; ++dy) {
int x = i + dx;
int y = j + dy;
int num = a[x][y];
if (vis[num]) return false;
vis[num] = true;
}
}
}
}
return true;
}
void solve(int case_id) {
cout << "Case #" << case_id << ": ";
memset(a, 0, sizeof(a));
cin >> tmp;
n = tmp * tmp;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
if (a[i][j] < 1 || a[i][j] > n) {
for (int k = j + 1; k <= n; k++) cin >> a[i][k];
for (int k = i + 1; k <= n; k++)
for (int l = 1; l <= n; l++) cin >> a[k][l];
cout << "No\n";
return;
}
}
}
if (check()) cout << "Yes\n";
else cout << "No\n";
}
signed main() {
cin.tie(0) -> sync_with_stdio(0);
int t; cin >> t;
for (int i = 1; i <= t; i++) solve(i);
return 0;
}
记得三连哦~