算法提高 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
 
关于八皇后问题(普通):
http://blog.csdn.net/mbh_1991/article/details/23869459  这个博客写的十分的好,我学习八皇后问题也是参照了这篇博客。
关于本题:
1. 主要就是 用结构体 组织数据结构
  1. const int maxn = ;
  2. struct Map {
  3. int value;
  4. int row, col; //这里写完发现可以省略.....
  5. bool isQue;
  6. Map(int r = , int c = , int v = , bool Q = false) :
  7. row(r), col(c), value(v), isQue(Q) {}
  8. } map[maxn][maxn];
 
2.  然后就如之前普通的八皇后解法差不多,在每到了一种方案,就对皇后标志为true的值统计一下sum, 对多种情况求max
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cstdio>
  5. using namespace std;
  6. const int maxn = ;
  7. struct Map {
  8. int value;
  9. int row, col;
  10. bool isQue;
  11. Map(int r = , int c = , int v = , bool Q = false) :
  12. row(r), col(c), value(v), isQue(Q) {}
  13. } map[maxn][maxn];
  14. //检测左上, 右上, 正上, 从上到下放置棋子, 且不需要检测横排
  15. int dir[][] = {{-, -}, {-, }, {-, }};
  16. int Q_sum;
  17. int Q_max; //用不同方式摆放Que,和最大的是
  18. int cnt;
  19. void init(); //初始化数据
  20. bool check(int r, int c); //检测能否放皇后
  21. bool judge(int r, int c); //检测是否越界
  22. void solve(); //解决问题的接口
  23. void dfs(); //回溯,深搜
  24. void findMax(); //寻找方案的最大值
  25. //启动程序
  26. void AutoStartProcess();
  27. void init()
  28. {
  29. for (int i = ; i < ; i++)
  30. {
  31. for (int j = ; j < ; j++) {
  32. // map[i][j].value = i*8 + j + 1;
  33. // map[i][j].isQue = false;
  34. cin >> map[i][j].value;
  35. map[i][j].isQue = false;
  36. map[i][j].row = i; map[i][j].col = j;
  37. }
  38. }
  39. }
  40. //检测越界, ture -- 没有越界
  41. bool judge(int r, int c)
  42. {
  43. return (r >= && r < maxn) && (c >= && c < maxn);
  44. }
  45. //检测该位置是否能放皇后
  46. bool check(int r, int c)
  47. {
  48. if (!judge(r, c)) return false;
  49. int p = ;
  50. bool isOk = true;
  51. for (p = ; p < ; p++) //检测三个方向
  52. {
  53. int tr = r, tc = c;
  54. //判断一个方向是否放过皇后
  55. while (isOk && judge(tr, tc)) //判断是否越界
  56. {
  57. tr = tr + dir[p][];
  58. tc = tc + dir[p][];
  59. //判断这个方向没有放过皇后 ,(!judge())越界当然是没有放过皇后的情况
  60. isOk = isOk && (!judge(tr, tc) || !map[tr][tc].isQue);
  61. }
  62. }
  63. return isOk; //true-可以放皇后, 不可以返回false
  64. }
  65. void dfs(int cur)
  66. {
  67. int j = ;
  68. if (cur == maxn) { //判断是否超过了第8-1行
  69. findMax(); //计算当前方案的sum
  70. cnt++;
  71. }
  72. else
  73. {
  74. for (j = ; j < maxn; j++)
  75. {
  76. if (check(cur, j)) {
  77. map[cur][j].isQue = true;
  78. dfs(cur + );
  79. map[cur][j].isQue = false;
  80. }
  81. }
  82. }
  83. }
  84. void findMax()
  85. {
  86. for (int i_1 = ; i_1 < maxn; i_1++) {
  87. for (int j_1 = ; j_1 < maxn; j_1++) {
  88. if (map[i_1][j_1].isQue) {
  89. Q_sum += map[i_1][j_1].value;
  90. }
  91. }
  92. }
  93. if (Q_sum > Q_max) {
  94. Q_max = Q_sum; //更新最大值
  95. }
  96. Q_sum = ;
  97. }
  98. void solve()
  99. {
  100. init();
  101. dfs();
  102. printf("%d\n", Q_max);
  103. // cout << cnt << endl;
  104. }
  105. void AutoStartProcess()
  106. {
  107. solve();
  108. }
  109. int main()
  110. {
  111. AutoStartProcess();
  112. return ;
  113. }
 
 
 
 
 
 
 
 
 
 

蓝桥杯 算法提高 8皇后·改 -- DFS 回溯的更多相关文章

  1. Java实现蓝桥杯 算法提高 八皇后 改

    **算法提高 8皇后·改** 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋 ...

  2. 问题 1936: [蓝桥杯][算法提高VIP]最大乘积

    问题 1936: [蓝桥杯][算法提高VIP]最大乘积 时间限制: 1Sec 内存限制: 128MB 提交: 77 解决: 16 题目描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? ...

  3. 蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法)

    蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法) 首先这不是一个多难的题,但是网上的我没怎么找到有Java的代码,基本全都是c语言的,小编是个小白,如果有不对的地方请联系小编 问题描述 ...

  4. 蓝桥杯--算法提高 排列数 (简单dfs)

    算法提高 排列数   时间限制:1.0s   内存限制:256.0MB      问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...

  5. Java实现 蓝桥杯 算法提高 进攻策略加强(暴力)

    试题 算法提高 进攻策略加强 问题描述 植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物. 首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻.使用第i种僵尸需要 ...

  6. Java实现 蓝桥杯 算法提高 小X的购物计划

    试题 算法提高 小X的购物计划 问题描述 小X打算去超市shopping.小X没什么钱,只有N元.超市里有M种物品,每种物品都需要money,在小X心中有一个重要度.有的物品有无限件,有的物品只有几件 ...

  7. 蓝桥杯算法提高 P1001(大数乘法)

      算法提高 P1001   时间限制:1.0s   内存限制:256.0MB   当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...

  8. 蓝桥杯 算法提高 金属采集 [ 树形dp 经典 ]

    传送门 算法提高 金属采集 时间限制:1.0s   内存限制:256.0MB     锦囊1   锦囊2   锦囊3   问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫 ...

  9. Java实现 蓝桥杯 算法提高 字符串匹配

    试题 算法提高 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时 ...

随机推荐

  1. Web项目开发流程 PC端

      一.了解.明确需求. 这个应该是第一步了,不了解需求你就不知道为什么要做,要怎么去做这个项目的工作. (1)明确需求是相当重要的,很有必要去和产品经理.设计人员去沟通,需要明白每一个按钮,每一个开 ...

  2. Spark 实践——基于 Spark MLlib 和 YFCC 100M 数据集的景点推荐系统

    1.前言 上接 YFCC 100M数据集分析笔记 和 使用百度地图api可视化聚类结果, 在对 YFCC 100M 聚类出的景点信息的基础上,使用 Spark MLlib 提供的 ALS 算法构建推荐 ...

  3. Beta冲刺预备

    作业链接 Beta冲刺随笔集 github地址 讨论组长是否重选的议题和结论 在Alpha阶段我们由于没有项目经验,很多技术都仅限于书本上的知识,没有真正实践过,所以出现各种各样的问题,在组长的带领下 ...

  4. Access restriction: The type 'BASE64Decoder' is not API

    Access restriction: The type 'BASE64Decoder' is not API (restriction on required library 'C:\Program ...

  5. spring not_support 该方法被事务方法调用时 不会加入spring事务 只是执行jdbc普通的事务

  6. 一本通1633【例 3】Sumdiv

    1633:[例 3]Sumdiv 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 原题来自:Romania OI 2002 求 ABAB 的所有约数之和 mo ...

  7. dp乱写1:状态压缩dp(状压dp)炮兵阵地

    https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...

  8. 解决 No Entity Framework provider found for the ADO.NET provider

    方法很简单,添加下面的dll即可 EntityFramework.SqlServer.dll     疯吻IT

  9. suoi22 WRX知识树(dfs序)

    把一条路径拆成到根的四个链(两端点.lca和fa[lca]),然后给dfs序中链的端点做单点修改.区间查询它的子树和再加上它原来的权值就可以了 #include<bits/stdc++.h> ...

  10. 收藏:Windows消息机制

    百度百科介绍的windows消息机制也不错:http://baike.baidu.com/view/672379.htm Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视 ...