显示原始代码
#include <bits/stdc++.h>
using namespace std;
int a[5][5];
int s[12], num[12];
bool out = false;
bool isprime(int n) {
for (int i = 2; i <= n / i; ++i) {
if (n % i == 0)
return false;
}
return true;
}
void dfs(int pos) {
if (pos == 25) {
out = true;
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j) {
printf("%d", a[i][j]);
}
printf("\n");
}
return;
}
int r = pos / 4, c = pos % 4;
if (r == 4) {
if (s[c + 5] >= 10 || s[c + 5] & 1 == 0 || s[c + 5] == 5)
return;
a[r][c] = s[c + 5];
if (c == 0) {
if (s[10] - a[r][c] != 0)
return;
num[10] = 0;
for (int i = 0; i < 5; ++i) num[10] = num[10] * 10 + a[4 - i][i];
if (!isprime(num[10]))
return;
} else if (c == 4) {
if (s[11] - a[r][c] != 0)
return;
num[11] = 0;
for (int i = 0; i < 5; ++i) num[11] = num[11] * 10 + a[i][i];
if (!isprime(num[11]))
return;
}
num[c + 5] = 0;
for (int i = 0; i < 5; ++i) num[c + 5] = num[c + 5] * 10 + a[i][c];
if (!isprime(num[c + 5]))
return;
dfs(pos + 1);
} else if (c == 4) {
if (s[r] >= 10 || s[r] & 1 == 0 || s[r] == 5)
return;
a[r][c] = s[r];
num[r] = 0;
for (int i = 0; i < 5; ++i) num[r] = num[r] * 10 + a[r][i];
if (!isprime(num[r]))
return;
dfs(pos + 1);
} else {
int minn = 10;
minn = min(10, min(min(s[10], s[11]), min(s[r], s[c + 5])));
if (c == 0 xor r == 0) {
for (int i = 1; i < minn; ++i) {
a[r][c] = i;
s[r] -= i;
s[c + 5] -= i;
if (r == c) {
s[11] -= i;
}
if (r + c == 4) {
s[10] -= i;
}
dfs(pos + 1);
if (r == c) {
s[11] += i;
}
if (r + c == 4) {
s[10] += i;
}
s[r] += i;
s[c + 5] += i;
}
} else {
for (int i = 0; i < minn; ++i) {
a[r][c] = i;
s[r] -= i;
s[c + 5] -= i;
if (r == c) {
s[11] -= i;
}
if (r + c == 4) {
s[10] -= i;
}
dfs(pos + 1);
if (r == c) {
s[11] += i;
}
if (r + c == 4) {
s[10] += i;
}
s[r] += i;
s[c + 5] += i;
}
}
}
return;
}
int main() {
int sum;
scanf("%d %d", &sum, &a[1][1]);
for (int i = 0; i < 12; ++i) s[i] = sum;
dfs(1);
if (out == false)
printf("NONE");
return 0;
}