题目大意:八皇后,即横竖和两条对角线上不能同时摆放,不同的是在每个格子上有值,求八个格子的和最大是多少,输出宽度 5。
解题思路:多一个 tmp 去计算值的和即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int map[10][10];
bool vis[3][20];
int C[10];
int ans, tmp;
int n = 8;
void search(int cur) {
if (cur == n) {
if (tmp > ans) ans = tmp;
return;
}
else for (int i = 0; i < n; i++) {
if (!vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+n]) {
vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 1;
tmp += map[i][cur];
search(cur+1);
vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 0;
tmp -= map[i][cur];
}
}
}
int main() {
int k;
scanf("%d", &k);
while (k--) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &map[i][j]);
memset(vis, 0, sizeof(vis));
ans = tmp = 0;
search(0);
printf("%5d\n", ans);
}
return 0;
}