计蒜客 八皇后问题
来源:互联网 发布:ctrl alt 互换 linux 编辑:程序博客网 时间:2024/06/03 21:15
八皇后问题:
蒜头君在和朋友下国际象棋,下的时候突发奇想,在国际象棋棋盘的每个格子上写下 111 到999999 内的数字,又拿出了珍藏已久的888 个皇后棋子。国际象棋中的皇后可以将同一行、同一列和同一对角线上的对方棋子吃掉。小蒜头在想,怎么摆放这888 个皇后的位置才能让她们不能互相攻击,同时这888 个皇后占的格子上的数字总和最大。
蒜头君来求助热爱算法的你了,你能帮她算出答案吗?
输入格式
每个棋盘有 646464 个数字,分成888 行888 列输入,就如样例所示。棋盘上每一个数字均小于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;}
阅读全文
0 0
- 计蒜客-八皇后问题
- 计蒜客 八皇后问题
- 八皇后问题(计蒜客)
- 计蒜客—八皇后问题
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题(2)
- 八皇后问题(3)
- 八皇后问题
- 八皇后问题程序
- 浅谈八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- PHP下载EXECE表格
- Ext GridPanel 设置点击次数打开可编辑单元格
- 选择排序之--堆排序
- js打印技巧
- jq的一些取值
- 计蒜客 八皇后问题
- lvm
- java数据库连接池代码实现
- java实现FTP多线程断点续传,上传下载!
- Android自定义对话框
- 从送外卖到建站售主机还有共享自行车说起-2017年8月江西IDC排行榜与发展报告
- 制作ubuntu根文件系统
- javascript向上向下取整
- 安全获取操作系统位数