CODE:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 8
int G[MAXN][MAXN];
int A[MAXN];
bool vis[3][MAXN*2];
int ans;
void dfs(int n, int cur = 0)
{
if(cur == n)
{
int tot = 0;
for(int i = 0; i < n; i++) tot += G[i][A[i]];
if(tot > ans) ans = tot;
}
else for(int i = 0; i < 8; i++)
{
A[cur] = 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;
dfs(n, cur+1);
vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 0;
}
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
ans = 0;
memset(vis, 0, sizeof(vis));
for(int i = 0; i < 64; i++) scanf("%d", &G[i/8][i%8]);
dfs(8);
printf("%5d\n", ans);
}
return 0;
}
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 8
int G[MAXN][MAXN];
int A[MAXN];
bool vis[3][MAXN*2];
int ans;
void dfs(int n, int cur = 0)
{
if(cur == n)
{
int tot = 0;
for(int i = 0; i < n; i++) tot += G[i][A[i]];
if(tot > ans) ans = tot;
}
else for(int i = 0; i < 8; i++)
{
A[cur] = 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;
dfs(n, cur+1);
vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 0;
}
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
ans = 0;
memset(vis, 0, sizeof(vis));
for(int i = 0; i < 64; i++) scanf("%d", &G[i/8][i%8]);
dfs(8);
printf("%5d\n", ans);
}
return 0;
}