蒜头君在和朋友下国际象棋,下的时候突发奇想,在国际象棋棋盘的每个格子上写下 1 到 99 内的数字,又拿出了珍藏已久的 8 个皇后棋子。国际象棋中的皇后可以将同一行、同一列和同一对角线上的对方棋子吃掉。小蒜头在想,怎么摆放这 8 个皇后的位置才能让她们不能互相攻击,同时这 8 个皇后占的格子上的数字总和最大。
蒜头君来求助热爱算法的你了,你能帮他算出答案吗?
输入格式
每个棋盘有 64 个数字,分成 8 行 8 列输入,就如样例所示。棋盘上每一个数字均小于 100。
输出格式
输出一个最大的总和
样例输入
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
样例输出
260
#include<iostream>
using namespace std;
#define N 8
int Matrix[N][N];
int Max;
bool check(int *a, int row, int col) //判断第row行col列能否可以放置皇后
{
for (int k = 0; k < row; k++)
{
if (a[k] == col || k - row == a[k] - col || k - row == -(a[k] - col))
return false;
}
return true;
}
int Add_queen(int *a) //计算8皇后占的格子数字和
{
int sum = 0;
for (int i = 0; i < N; i++)
{
sum += Matrix[i][a[i]];
}
return sum;
}
void Queens(int *a, int row) //计算从row行到第N-1行放置皇后的位置
{
if (row == N) //若所有行都放置了皇后,则计算和
{
if (Add_queen(a) > Max)
Max = Add_queen(a);
}
for (int col = 0; col < N; col++)
{
if (check(a, row, col))
{
a[row] = col;
Queens(a, row + 1);
}
}
}
int main()
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> Matrix[i][j];
}
}
Max = 0;
int a[8]; //用于储存各皇后在各行的位置
Queens(a, 0); //计算从0行到第N-1行放置皇后的位置
cout << Max << endl;
return 0;
}