问题描述
规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
输入格式
一个8*8的棋盘。
输出格式
所能得到的最大数字和
样例输入
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
数据规模和约定
棋盘上的数字范围0~99
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n=8, sum=0, msum=0;
int a[10][10] = { 0 }, b[10][10];
int t = 1;
void print()
{
printf("No. %d\n", t++);
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
printf("%d ", a[j][i]);
}
printf("\n");
}
}
bool judge(int x, int y)
{
for(int i=0; i<x; i++)
{//竖直方向||左上方 || 右上方
if(a[i][y] || (y-i-1>=0 && a[x-i-1][y-i-1]) || (y+i+1<8 && a[x-i-1][y+i+1]))
return false;
}
return true;
}
/*
void dfs(int num)
{
if (num >= 8){
print();
}
for (int i = 0; i < 8; i++)
{
if (a[num][i]!=1&&judge(num, i))
{
a[num][i] = 1;
dfs(num + 1);
a[num][i] = 0;
}
}
}
*/
int dfs(int num)
{
if (num >= 8){
// print();
if(msum < sum)
msum = sum;
}
for (int i = 0; i < 8; i++)
{
if (a[num][i]!=1&&judge(num, i))
{
a[num][i] = 1;
sum += b[num][i];
if(dfs(num + 1))
{ return 1;}
a[num][i] = 0;
sum -= b[num][i];
}
}
return 0;
}
int main()
{
for(int i=0; i<8; i++)
for(int j=0; j<8; j++)
cin >> b[i][j];
dfs(0);
cout << msum;
return 0;
}