比赛 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;
}