蒜头君在和朋友下国际象棋,下的时候突发奇想,在国际象棋棋盘的每个格子上写下 111 到 999999 内的数字,又拿出了珍藏已久的 888 个皇后棋子。国际象棋中的皇后可以将同一行、同一列和同一对角线上的对方棋子吃掉。小蒜头在想,怎么摆放这 888 个皇后的位置才能让她们不能互相攻击,同时这 888 个皇后占的格子上的数字总和最大。
蒜头君来求助热爱算法的你了,你能帮她算出答案吗?
输入格式
每个棋盘有 646464 个数字,分成 888 行 888 列输入,就如样例所示。棋盘上每一个数字均小于 100100100。
输出格式
输出一个最大的总和
样例输入
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>
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m,max1=0;
int a[10][10];
int b[10];
bool pan(int x,int y)
{
for(int i=1;i<x;i++)
{
if(b[x]==y||(abs(i-x)==abs(y-b[x])))
//作为判断条件,当下一个点在同一列或对角斜线上是返回false
return false;
}
return true;
}
int dfs(int s,int sum)
{
if(s==9)
{
max1=max(sum,max1);
return 0;
}//用来记录众多结果中最大的一个
for(int i=1;i<=8;i++)
{
if(pan(s,i))
{
b[s]=i;//用来记录上一个结果的列坐标
dfs(s+1,sum+a[s][i]);//不断回溯判断
}
}
}
int main()
{
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
cin>>a[i][j];
}
}
dfs(1,0);
cout<<max1;
return 0;
}