非常简单的一道题目。
首先,每一行的数之和一定为所有的数之和再除以n。那么根据这个进行dfs并加入剪枝就可以了。
#include<iostream>
#include<algorithm>
using namespace std;
int sum, n;
int vis[16], a[16];
int b[4][4];
bool isRight() {
int s = 0;
for (int i = 0; i < n; i++) {
s = 0;
for (int j = 0; j < n; j++) {
s += b[i][j];
}
if (s != sum)
return 0;
}
for (int i = 0; i < n; i++) {
s = 0;
for (int j = 0; j < n; j++) {
s += b[j][i];
}
if (s != sum)
return 0;
}
s = 0;
for (int i = 0; i < n; i++)
s += b[i][i];
if (s != sum)
return 0;
s = 0;
for (int i = 0; i < n; i++)
s += b[i][n - i - 1];
if (s != sum)
return 0;
return 1;
}
void DFS(int x,int y, int z) {
if (y == n) {
y = 0;
x++;
if (z != sum)
return;
z = 0;
}
if (x == n) {//结束之后判断
if (isRight() == 1) {
cout << sum << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << b[i][j] << " ";
cout << endl;
}
exit(0);
}
else return;
}
for (int i = 0; i < n * n; i++)//选择填哪个数
if (!vis[i]) {
vis[i] = 1;
b[x][y] = a[i];
DFS(x, y + 1, z + a[i]);
vis[i] = 0;
b[x][y] = 0;
}
}
int main()
{
cin >> n;
for (int i = 0; i < n * n; i++) {
cin >> a[i];
sum += a[i];
}
sum /= n;
sort(a, a + n * n);
DFS(0, 0, 0);
}