蓝桥杯 ADV-203 算法提高 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

扫描二维码关注公众号,回复: 9649249 查看本文章

样例输出
260

数据规模和约定
  棋盘上的数字范围0~99

 

#include <stdio.h>

int chessboard[8][8] = { 0 };
int current_sum, max_sum;
int column[8];

int abs(int x)
{
    return x > 0 ? x : -x;
}

int is_valid(int row_idx, int col_idx)
{
    for (int i = 0; i < row_idx; ++i)
    {
        if (column[i] == col_idx || abs(column[i] - col_idx) == abs(i - row_idx))
            return 0;
    }
    return 1;
}

void solve(int row_idx)
{
    if (row_idx == 8)
    {
        if (current_sum > max_sum)
            max_sum = current_sum;
        return;
    }

    for (int j = 0; j < 8; ++j)
    {
        if (is_valid(row_idx, j))
        {
            column[row_idx] = j;
            current_sum += chessboard[row_idx][j];
            solve(row_idx + 1);
            current_sum -= chessboard[row_idx][j];
        }
    }
}

int main()
{
    for (int i = 0; i < 8; ++i)
        for (int j = 0; j < 8; ++j)
            scanf("%d", &chessboard[i][j]);

    current_sum = 0;
    max_sum = -0x3F3F3F3F;
    solve(0);
    printf("%d", max_sum);

    return 0;
}
发布了358 篇原创文章 · 获赞 46 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/liulizhi1996/article/details/104401845