问题:16 8皇后·改
问题描述:
规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
输入说明 :
一个8*8的棋盘。
数据规模和约定
棋盘上的数字范围0~99
输出说明 :
所能得到的最大数字和
输入范例 :
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
思路:
和8皇后思路一样,唯一不弄的就是在dfs中加入一个求和变量,找到一组结果时判定res和最大值的大小即可
代码实现:
#include<bits/stdc++.h>
using namespace std;
int chessboard[9][9];
int a[9];
int maxValue=0;
bool Check(int row,int cow)
{
for(int i=1;i<=row;i++)
{
if(a[i]==cow) return false;
if(i+a[i]==row+cow) return false;
if(i-a[i]==row-cow) return false;
}
return true;
}
void Dfs(int row,int res)
{
if(row==9)
{
if(res>maxValue)
maxValue=res;
return;
}
else
{
for(int i=1;i<=8;i++)
{
if(Check(row,i))
{
a[row]=i;
Dfs(row+1,res+chessboard[row][i]);
a[row]=0;
}
}
}
}
int main()
{
for(int i=1;i<=8;i++)
{
a[i]=0;
for(int j=1;j<=8;j++)
{
cin>>chessboard[i][j];
}
}
Dfs(1,0);
cout<<maxValue<<endl;
}