计蒜客 八皇后问题

来源:互联网 发布:ctrl alt 互换 linux 编辑:程序博客网 时间:2024/06/03 21:15

八皇后问题:

蒜头君在和朋友下国际象棋,下的时候突发奇想,在国际象棋棋盘的每个格子上写下 111999999 内的数字,又拿出了珍藏已久的888 个皇后棋子。国际象棋中的皇后可以将同一行、同一列和同一对角线上的对方棋子吃掉。小蒜头在想,怎么摆放这888 个皇后的位置才能让她们不能互相攻击,同时这888 个皇后占的格子上的数字总和最大。

蒜头君来求助热爱算法的你了,你能帮她算出答案吗?

输入格式

每个棋盘有 646464 个数字,分成888888 列输入,就如样例所示。棋盘上每一个数字均小于100100100

输出格式

输出一个最大的总和

样例输入

1  2  3  4  5  6  7  89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 4848 50 51 52 53 54 55 5657 58 59 60 61 62 63 64

样例输出

260

解析:

棋盘上,对于点a[i][j]

主对角线(即左上至右下)上的每个点的i-j+7的值(范围在(0,14))均相等;

副对角线(即右上至左下)上的每个点的i+j的值(范围在(0,14))均相等;

因此可设两个数组b[15]c[15],为true表示可以摆放皇后,为false表示不可以摆放皇后。

#include #include using namespace std;int map[100][100];int max1 = 0;int sum;bool row[10];   //列bool b[15];   //主对角线bool c[15];   //副对角线void dfs(int line){if (line == 8){if (sum > max1)max1 = sum;elsemax1 = max1;return;}else{for (int i = 0; i < 8; i++){if (!row[i] && !b[line+i] && !c[line-i+7]){row[i] = true;   //安置皇后b[line + i] = true;c[line - i + 7] = true;sum += map[line][i];dfs(line + 1); row[i] = false;           //重置b[line + i] = false;c[line - i + 7] = false;sum -= map[line][i];}}}}int main(){for (int i = 0; i < 8; i++)for (int j = 0; j < 8; j++)scanf("%d", &map[i][j]);dfs(0);printf("%d", max1);return 0;}



原创粉丝点击