算法提高 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;
}