『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录:
一、回溯算法的基本思想以及个人理解
二、“子集和”问题的解空间结构和约束函数
三、一道经典回溯法题点拨升华回溯法思想
四、结对编程情况
一、回溯算法的基本思想以及个人理解:
1.1 基本概念:
回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。
1.2 使用条件:
当问题是要求满足某种性质(约束条件)的所有解或最优解时,便可以使用回溯法,其实有暴力剪枝的意味
1.3 使用思想:
回溯法常常使用DFS(深度优先搜索)来进行对解空间的答案搜索。
首先从根根部节点出发搜索解空间,当搜索至解空间的某一节点时,先利用约束或限界剪枝函数来判断该节点是否是问题的解。如果不是,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。
回溯法的基本行为是优雅的暴力搜索,搜索过程进行剪枝来为了避免无效冗余的搜索。
剪枝主要包括两类:
1. 使用约束函数,剪去不满足约束条件的路径;
2.使用限界函数,剪去不能得到最优解的路径。
1.4 回溯算法的经典问题种类:
(1)装载问题
(2)0-1背包问题
(3)旅行售货员问题
(4)八皇后问题
(5)迷宫问题
(6)图的m着色问题
二、“子集和”问题的解空间结构和约束函数:
(1)解空间结构
非负非零整数集合S={x1,x2,…,xn}对应的的一个子集S1,S1中的元素之和为c。
(2)约束函数
若当前数总和加上下一个数,大于题目所给数时,我们则选择不要这个数。
用now表示不算已选择的元素的其他元素的值得总和, aim为题目所需要的输入的和的总值,
now+temp[i]<=aim;
在代码中可以直接用分支判断进入递归,也可以在递归头进行返回判断,在这里我使用递归头直接判断
即:if(i>=times || flag == 1) return; flag在分支中进行标记判断是否大于aim值
三、一道经典回溯法题点拨升华回溯法思想:
3.1 题目来源:
USACO-cha1-sec1.5 Checker Challenge
http://www.nocow.cn/index.php/Translate:USACO/checker
3.2 题目题干:
Checker Challenge
Examine the 6x6 checkerboard below and note that the six checkers are arranged on the board so that one and only one is placed in each row and each column, and there is never more than one in any diagonal. (Diagonals run from southeast to northwest and southwest to northeast and include all diagonals, not just the major two.)

The solution shown above is described by the sequence 2 4 6 1 3 5, which gives the column positions of the checkers for each row from 1 to 6:
ROW 1 2 3 4 5 6
COLUMN 2 4 6 1 3 5
This is one solution to the checker challenge. Write a program that finds all unique solution sequences to the Checker Challenge (with ever growing values of N). Print the solutions using the column notation described above. Print the the first three solutions in numerical order, as if the checker positions form the digits of a large number, and then a line with the total number of solutions.
Special note: the larger values of N require your program to be especially efficient. Do not precalculate the value and print it (or even find a formula for it); that's cheating. Work on your program until it can solve the problem properly. If you insist on cheating, your login to the USACO training pages will be removed and you will be disqualified from all USACO competitions. YOU HAVE BEEN WARNED.
INPUT FORMAT
A single line that contains a single integer N ( <= N <= ) that is the dimension of the N x N checkerboard.
SAMPLE INPUT (file checker.in)
OUTPUT FORMAT
The first three lines show the first three solutions found, presented as N numbers with a single space between them. The fourth line shows the total number of solutions found.
SAMPLE OUTPUT (file checker.out)
3.3 题目大意:
题目意思是:
一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。
找出所有棋子放置的解。并把它们以上面的序列方法输出,解按字典顺序排列。
3.4 题目思路:
八皇后题型,非常典型的回溯法解题。
对于一条从右上到左下的对角线,其上的棋子坐标应满足x+y为一定值;
对于一条从左上到右下的对角线,其上的棋子坐标应满足x-y为一定值,为了避免负数的产生,代码中用x-y+times来储存数字。
对于语句
if( check[0][i] != 1 )
if( check[1][t+i] != 1)
if( check[2][t-i+times] != 1 )
只要满足这三个数字均为使用过,则在temp[line]=i处放置棋子,并将check数组中的相应数值标记为已使用,并对下一行进行搜索。
由于题目要求输出前3组解,所以计数器cnt>3时不输出结果,最后在main函数中输出最终解的数量。
3.5 题目AC代码:
#include<bits/stdc++.h>
using namespace std; int times,ans,cnt,temp[],check[][];
void back(int t)
{
if(t > times)
{
cnt++;
if(cnt>)
return ;
for(int i = ;i<=times;i++)
cout<<temp[i]<<" ";
cout<<"\n";
return ;
} for(int i = ;i<=times;i++)
{
if( check[][i] != )
if( check[][t+i] != )
if( check[][t-i+times] != )
{
temp[t] = i;
check[][i] = check[][t+i] = check[][t-i+times] = ;
back(t+);
check[][i] = check[][t+i] = check[][t-i+times] = ;
}
}
}
int main()
{
cin>>times;
back();
cout<<cnt;
return ;
}
四、 结对编程情况:
一学期的合作打题还算是友好合作型,在共同研究算法以及在思维碰撞的过程中找到合理的解题思路,相互梳理的过程是很nice的一个过程。
这或许就是ACMer结对比赛的一种魅力吧,有时候一个人的力量常常不如一个团队的力量来的直接,希望以后在各个项目的合作过程中都能遇到像三木这么nice的小哥哥(商业互吹)。
如有不合理的地方,请及时指正,我愿听取改正~
参考链接:https://oi-wiki.org/
『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)的更多相关文章
- 『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)
本文索引目录: 一.动态规划的基本思想 二.数字三角形.最大子段和(PTA)递归方程 三.一道区间动态规划题点拨升华动态规划思想 四.结对编程情况 一.动态规划的基本思想: 1.1 基本概念: 动态规 ...
- 『嗨威说』算法设计与分析 - 贪心算法思想小结(HDU 2088 Box of Bricks)
本文索引目录: 一.贪心算法的基本思想以及个人理解 二.汽车加油问题的贪心选择性质 三.一道贪心算法题点拨升华贪心思想 四.结对编程情况 一.贪心算法的基本思想以及个人理解: 1.1 基本概念: 首先 ...
- 『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)
本文索引目录: 一.PTA实验报告题1 : 数字三角形 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 最大子段和 2.1 实践题目 ...
- 『嗨威说』算法设计与分析 - STL中Sort函数的实现原理初探
本文索引目录: 一.对Sort算法实现的个人阅读体会 二.Sort算法使用的三个排序算法的优点介绍 2.1 插入排序的优缺点 2.2 堆排序的优缺点 2.3 快速排序的优缺点 2.4 新的结合排序—— ...
- 『嗨威说』算法设计与分析 - PTA 程序存储问题 / 删数问题 / 最优合并问题(第四章上机实践报告)
本文索引目录: 一.PTA实验报告题1 : 程序存储问题 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 删数问题 2.1 实践题目 ...
- 『嗨威说』常见的C++函数模板整理(一)
开学两天,身上的职责直接变为两个班班长,三个小组组长,哇这事情估计够我忙活了,想躲都躲不掉啊,看来我还是真招人推荐各种管理职务啊,以后要是有人推荐我当经理啊领导啊该多好哈哈哈哈.记得今天奶奶生日,很开 ...
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划
由于种种原因(看这一章间隔的时间太长,弄不清动态规划.分治.递归是什么关系),导致这章内容看了三遍才基本看懂动态规划是什么.动态规划适合解决可分阶段的组合优化问题,但它又不同于贪心算法,动态规划所解决 ...
- 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)
PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...
- 算法设计与分析 - AC 题目 - 第 2 弹
PTA-算法设计与分析-AC原题7-1 最大子列和问题 (20分)给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 ...
随机推荐
- OS X 下 OpenGL 4.x 环境配置
配置: OS X 10.10 + CMake 3.2.2 + GLFW 3.1.1 + OpenGL 4.1 + Xcode 6.0 本文主要介绍如何在 OS X 系统下进行环境配置,使得 Xcode ...
- 字节码联盟成立,WebAssembly 生态将完善网络安全性
近日 Mozilla.Fastly.Intel 与 Red Hat 宣布成立联合组织 Bytecode Alliance(字节码联盟),该联盟旨在通过协作实施标准和提出新标准,以完善 WebAssem ...
- R学习
R内容: R-1 基础 R-2 基础绘图 R-3 t分布--t置信区间--t检验 R-4 方差分析 R-5 相关分析-卡方分析 R-6 线性回归模型分析流程 R实战第7章 线性回归 逻辑回归 主成分分 ...
- 邹传伟:对人民银行DC/EP的初步分析
http://opinion.caixin.com/2019-11-01/101477903.html [财新网](专栏作家 邹传伟)2019年10月24日,习总书记在中央政治局第十八次集体学习中指出 ...
- 剑指Offer-37.二叉树的深度(C++/Java)
题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 分析: 递归求解左右子树的最大值即可,每遍历到一个结点,深度加1,最后 ...
- 第05组 Beta版本演示
第05组 Beta版本演示 小组信息 组名:天码行空 组长博客:地址 组内成员: 组员 学号 卢欢(组长) 031702513 陈天恒 031702527 古力亚尔·艾山 031702511 张聪 0 ...
- Notepad++ 异常崩溃 未保存的new *文件列表没了怎么办?
今天就遇到这种问题了,把之前写的临时代码拷贝到Notepad++,不知道啥时候脑袋一抽风强迫症犯了就把所有临时代码给未保存关闭了,然后懊恼不已,百度了一下解决办法,一下就搜到了. Notepad++是 ...
- 配置 Elasticsearch 集群
Elasticsearch 的安装非常简单,笔者在前文<单机部署 ELK>中已经介绍过了,本文主要介绍集群的配置,并解释常见配置参数的含义. 要配置集群,最简单的情况下,设置下面几个参数就 ...
- PAT 1006 Sign In and Sign Out 查找元素
At the beginning of every day, the first person who signs in the computer room will unlock the door, ...
- spring = servlet + 依赖管理 + 业务逻辑
spring = servlet + 依赖管理 + 业务逻辑