算法提高 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. 主要就是 用结构体 组织数据结构
const int maxn = ;
struct Map {
int value;
int row, col; //这里写完发现可以省略.....
bool isQue;
Map(int r = , int c = , int v = , bool Q = false) :
row(r), col(c), value(v), isQue(Q) {}
} map[maxn][maxn];
 
2.  然后就如之前普通的八皇后解法差不多,在每到了一种方案,就对皇后标志为true的值统计一下sum, 对多种情况求max
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std; const int maxn = ;
struct Map {
int value;
int row, col;
bool isQue;
Map(int r = , int c = , int v = , bool Q = false) :
row(r), col(c), value(v), isQue(Q) {}
} map[maxn][maxn];
//检测左上, 右上, 正上, 从上到下放置棋子, 且不需要检测横排
int dir[][] = {{-, -}, {-, }, {-, }};
int Q_sum;
int Q_max; //用不同方式摆放Que,和最大的是
int cnt; void init(); //初始化数据
bool check(int r, int c); //检测能否放皇后
bool judge(int r, int c); //检测是否越界
void solve(); //解决问题的接口
void dfs(); //回溯,深搜
void findMax(); //寻找方案的最大值
//启动程序
void AutoStartProcess(); void init()
{
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++) {
// map[i][j].value = i*8 + j + 1;
// map[i][j].isQue = false; cin >> map[i][j].value;
map[i][j].isQue = false;
map[i][j].row = i; map[i][j].col = j;
}
}
} //检测越界, ture -- 没有越界
bool judge(int r, int c)
{
return (r >= && r < maxn) && (c >= && c < maxn);
}
//检测该位置是否能放皇后
bool check(int r, int c)
{
if (!judge(r, c)) return false; int p = ;
bool isOk = true;
for (p = ; p < ; p++) //检测三个方向
{
int tr = r, tc = c;
//判断一个方向是否放过皇后
while (isOk && judge(tr, tc)) //判断是否越界
{
tr = tr + dir[p][];
tc = tc + dir[p][];
//判断这个方向没有放过皇后 ,(!judge())越界当然是没有放过皇后的情况
isOk = isOk && (!judge(tr, tc) || !map[tr][tc].isQue);
}
}
return isOk; //true-可以放皇后, 不可以返回false
} void dfs(int cur)
{
int j = ; if (cur == maxn) { //判断是否超过了第8-1行
findMax(); //计算当前方案的sum
cnt++;
}
else
{
for (j = ; j < maxn; j++)
{
if (check(cur, j)) {
map[cur][j].isQue = true;
dfs(cur + );
map[cur][j].isQue = false;
}
}
}
} void findMax()
{
for (int i_1 = ; i_1 < maxn; i_1++) {
for (int j_1 = ; j_1 < maxn; j_1++) {
if (map[i_1][j_1].isQue) {
Q_sum += map[i_1][j_1].value;
}
}
}
if (Q_sum > Q_max) {
Q_max = Q_sum; //更新最大值
}
Q_sum = ;
} void solve()
{
init();
dfs();
printf("%d\n", Q_max);
// cout << cnt << endl;
} void AutoStartProcess()
{
solve();
} int main()
{
AutoStartProcess();
return ;
}
 
 
 
 
 
 
 
 
 
 

蓝桥杯 算法提高 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. Git版本库的创建(Ubuntu)

    在Ubuntu上学习Git随笔. 一. git 仓库的安装 git 在终端用git命令查看Ubuntu是否安装git版本库,如果没有安装,最新版本(Ubuntu18.04)会提示用下面命令进行安装. ...

  2. ssm整合各配置文件

    ssm整合 1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns ...

  3. 如何基于 K8S 多租能力构建 Serverless Container

    当前 Kubernetes 已经成为名副其实的企业级容器编排规范,很多云平台都开始提供兼容 Kubernetes 接口的容器服务.而在多用户支持方面,多数平台选择直接提供专属虚机集群,用户需要花费大量 ...

  4. C++基础知识(1)

    C语言是结构化编程语言(for循环.while循环.do while循环和if else语句),将低级语言的效率.硬件访问能力和高级语言的通用性.可移植性融合在一起. UNIX编译和链接 UNIX用C ...

  5. NO.3:自学tensorflow之路------MNIST识别,神经网络拓展

    引言 最近自学GRU神经网络,感觉真的不简单.为了能够快速跑完程序,给我的渣渣笔记本(GT650M)也安装了一个GPU版的tensorflow.顺便也更新了版本到了tensorflow-gpu 1.7 ...

  6. 2. Python3 基础入门

    Python3 基础入门 编码 在python3中,默认情况下以UTF-8编码.所有字符串都是 unicode 字符串,当然也可以指定不同编码.体验过2.x版本的编码问题,才知道什么叫难受. # -* ...

  7. webpack简单原理及用法

    前言 如果你已经对Webpack精通了或者至少一直在工作中使用它,请关闭当前浏览器标签,无视这篇文章. 这篇文章本意是写给我自己看的,作为一篇Cookbook供快速查询和上手用.原因是虽然工作中会涉及 ...

  8. Linux实验报告

    第一次链接: http://www.cnblogs.com/L1nke/p/4966820.html 第二次链接: http://www.cnblogs.com/L1nke/p/4992758.htm ...

  9. web框架-Struts开始

    问题: 为什么有structs 作为一种框架(frameset)可以与传统的mvc进行比较? MVC是一种模式数据处理.显示和数据输入分开,来规范开发,但是却又并不规范.可以这样想:有三家公司,他们对 ...

  10. C++ Makefile文件编写

    对现有的一个C++动态库文件和调用程序,分别编写Makefile文件,从零开始,这里把自己弄明白的一些东西分享给大家. 1.必须明确Linux下,C++的编译器是g++,C语言的是gcc.网上大多数又 ...