算法提高 8皇后·改

算法提高 8皇后·改
时间限制:1.0s 内存限制:256.0MB
提交此题
问题描述
  规则同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
using namespace std;
int num[10][10];
int pd[10][10];
int b[100],c[100],d[100];
int temp=-1;
void  fun(int i,int sum)//表示,前i-1个点的总值为sum
{
    if(i==8+1)
    {
        if (temp//通过比较的得出最大值
            temp=sum;
        return ;
    }
    for (int j=1;j<=8;j++)
    {
        if ((!b[j]&&!c[i+j]&&!d[i-j+8-1]))//不在一条线上
        {
            b[j]=1;
            c[i+j]=1;
            d[i-j+8-1]=1;

            fun(i+1,sum+num[i][j]);

            b[j]=0;//回溯
            c[i+j]=0;
            d[i-j+8-1]=0;
        }
    }
}

int main()
{
    for (int i=1;i<=8;i++)
    {
        for (int j=1;j<=8;j++)
        {
           cin>>num[i][j];
        }
    }
    fun(1,0);
    cout<return 0;
}

你可能感兴趣的:(递归回溯)