The Sultan's Successors (八皇后)DFS

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值