和八皇后问题一样,只不过在位置上放置了数字而已,要求把数字相加,达到最大
#include<cstdio>
#include<cstring>
int num[8][8];
int max;
int vis[3][14];
void dfs(int cur, int sum) {
if(cur == 8 && sum > max) {
max = sum;
return ;
}
if(cur == 8)
return;
for(int i = 0; i < 8; i++) {
if(!vis[0][i] && !vis[1][i-cur+7] && !vis[2][i+cur]) {
vis[0][i] = vis[1][i-cur+7] = vis[2][i+cur] = 1;
sum = sum + num[cur][i];
dfs(cur+1,sum);
sum = sum - num[cur][i];
vis[0][i] = vis[1][i-cur+7] = vis[2][i+cur] = 0;
}
}
}
int main() {
int test;
scanf("%d",&test);
while(test--) {
for(int i = 0; i < 8; i++)
for(int j = 0; j < 8; j++)
scanf("%d", &(num[i][j]));
memset(vis,0,sizeof(vis));
max = 0;
dfs(0,0);
printf("%5d\n", max);
}
return 0;
}