比赛 |
2025暑期集训第7场 |
评测结果 |
ATAAAAAAAA |
题目名称 |
填数 |
最终得分 |
90 |
用户昵称 |
对立猫猫对立 |
运行时间 |
3.528 s |
代码语言 |
C++ |
内存使用 |
3.63 MiB |
提交时间 |
2025-08-11 15:07:42 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int MAXNUM = 242;
const int MAXN = 11;
bool prime[MAXNUM + 1];
int n;
int board[MAXN][MAXN];
bool used[MAXN * MAXN + 1];
bool found = false;
void init() {
memset(prime, true, sizeof(prime));
prime[0] = prime[1] = false;
for (int i = 2; i * i <= MAXNUM; ++i) {
if (prime[i]) {
for (int j = i * i; j <= MAXNUM; j += i) {
prime[j] = false;
}
}
}
}
bool isvalid(int x, int y, int num) {
if (x > 0 && board[x - 1][y] != 0 && !prime[board[x - 1][y] + num])
return false;
if (y > 0 && board[x][y - 1] != 0 && !prime[board[x][y - 1] + num])
return false;
if (x < n - 1 && board[x + 1][y] != 0 && !prime[board[x + 1][y] + num])
return false;
if (y < n - 1 && board[x][y + 1] != 0 && !prime[board[x][y + 1] + num])
return false;
return true;
}
void dfs(int x, int y) {
if (found) return;
if (y == n) {
y = 0;
x++;
}
if (x == n) {
found = true;
return;
}
for (int num = 1; num <= n * n; ++num) {
if (!used[num] && isvalid(x, y, num)) {
board[x][y] = num;
used[num] = true;
dfs(x, y + 1);
if (found) return;
used[num] = false;
board[x][y] = 0;
}
}
}
int main() {
freopen("tianshu.in", "r", stdin);
freopen("tianshu.out", "w", stdout);
cin >> n;
if(n == 1) {
cout << "NO" << endl;
goto r1;
}
init();
memset(board, 0, sizeof(board));
memset(used, false, sizeof(used));
dfs(0, 0);
if (found) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << board[i][j] << " ";
}
cout << endl;
}
}
else {
cout << "NO" << endl;
}
r1:
return 0;
}