The Sultan’s Successors
原题链接https://vjudge.net/contest/345248#problem/F
八皇后问题,既在8*8的棋盘中放置8个皇后,每行,每列,每个对角线和副对角线都只能有一个皇后。
求出所有种类中皇后所在位置的数之和的最大值。
建立vis[105][105]来判断位置。
PS:
vis[0][i]==0 判断列
vis[1][i+sum]==0判断副对角线 // 同一副对角线i+j=定值
vis[2][i-sum+8]==0 判断对角线 // 同一对角线i-j为定值
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
long long map[105][105];
long long vis[105][105];
long long maxx;
void dfs(long long sum,long long sum1)
{
long long i;
if(sum==8)
{
if(maxx<sum1)
{
maxx=sum1;
}
}
else
{
for(i=0;i<8;i++)//一列一列进行读取,由于是一行一行计算,当前已选的点的个数即为行数。
{
if(vis[0][i]==0&&vis[1][i+sum]==0&&vis[2][i-sum+8]==0)//判断
{
vis[0][i]=1;
vis[1][i+sum]=1;
vis[2][i-sum+8]=1;
dfs(sum+1,sum1+map[sum][i]);
vis[0][i]=0;
vis[1][i+sum]=0;
vis[2][i-sum+8]=0;
}
}
}
}
int main ()
{
long long t;
scanf("%lld",&t);
while(t--)
{
long long i,j;
memset(vis,0,sizeof(vis));
memset(map,0,sizeof(map));
for(i=0;i<8;i++)//读取地图
{
for(j=0;j<8;j++)
{
scanf("%lld",&map[i][j]);
}
}
maxx=-1;
dfs(0,0);
printf("%5lld\n",maxx);
}
return 0;
}