八皇后计数,求最大。
#include<iostream>
#include<cmath>
#include<cstdio>
#include <cstring>
using std::cin;
using std::cout;
using std::endl;
int board[10][10], vis[3][20], c[10], n, tot;
void dfs(int cur)
{
if(cur == 8)
{
int sum = 0;
for(int i = 0; i < 8; i++)
sum += board[i][c[i]];
if(sum > tot)
tot = sum;
return;
}
for(int i = 0; i < 8; i++)
{
if(!vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+8])
{
c[cur] = i;
vis[0][i] = vis[1][cur+i] = vis[2][cur-i+8] = 1;
dfs(cur + 1);
vis[0][i] = vis[1][cur+i] = vis[2][cur-i+8] = 0;
}
}
}
int main()
{
cin >> n;
while(n--)
{
for(int i = 0; i < 8; i++)
for(int j = 0; j < 8; j++)
cin >> board[i][j];
memset(vis, 0, sizeof(vis));
tot = 0;
dfs(0);
printf("%5d\n", tot);
}
return 0;
}