(DFS)计蒜客——八皇后问题

蒜头君在和朋友下国际象棋,下的时候突发奇想,在国际象棋棋盘的每个格子上写下 1 到 99 内的数字,又拿出了珍藏已久的 8 个皇后棋子。国际象棋中的皇后可以将同一行、同一列和同一对角线上的对方棋子吃掉。小蒜头在想,怎么摆放这 8 个皇后的位置才能让她们不能互相攻击,同时这 8 个皇后占的格子上的数字总和最大。 
蒜头君来求助热爱算法的你了,你能帮他算出答案吗? 

输入格式 

每个棋盘有 64 个数字,分成 8 行 8 列输入,就如样例所示。棋盘上每一个数字均小于 100。 

输出格式 

输出一个最大的总和 

样例输入 

1 2 3 4 5 6 7 8 
9 10 11 12 13 14 15 16 
17 18 19 20 21 22 23 24 
25 26 27 28 29 30 31 32 
33 34 35 36 37 38 39 40 
41 42 43 44 45 46 47 48 
48 50 51 52 53 54 55 56 
57 58 59 60 61 62 63 64 

样例输出 

260

#include<iostream>
using namespace std;

#define N 8
int Matrix[N][N];
int Max;

bool check(int *a, int row, int col)   //判断第row行col列能否可以放置皇后
{
	for (int k = 0; k < row; k++)
	{
		if (a[k] == col || k - row == a[k] - col || k - row == -(a[k] - col))
			return false;
	}
	return true;
}

int Add_queen(int *a)     //计算8皇后占的格子数字和
{
	int sum = 0;
	for (int i = 0; i < N; i++)
	{
		sum += Matrix[i][a[i]];
	}
	return sum;
}

void Queens(int *a, int row)     //计算从row行到第N-1行放置皇后的位置
{
	if (row == N)          //若所有行都放置了皇后,则计算和
	{
		if (Add_queen(a) > Max)
			Max = Add_queen(a);
	}
	for (int col = 0; col < N; col++)
	{
		if (check(a, row, col))
		{
			a[row] = col;
			Queens(a, row + 1);
		}
	}
}

int main()
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			cin >> Matrix[i][j];
		}
	}

        Max = 0;
        int a[8];   //用于储存各皇后在各行的位置
	Queens(a, 0);  //计算从0行到第N-1行放置皇后的位置
	cout << Max << endl;

	return 0;
}

 

    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/rayue_/article/details/82937173
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞