『嗨威说』算法设计与分析 - 回溯法思想小结(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 ...
随机推荐
- OAuthon2.0机制详解
最近在忙企业微信和钉钉的第三方应用开发,需要获取一些信息,第一个就是这个OAuthon2.0,先详细了解下概念和流程 一.应用场景 我们要想用第三方播放器播放你的云盘账号里面的一些秘密视频资源,为了要 ...
- Attention 和self-attention
1.Attention 最先出自于Bengio团队一篇论文:NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE ...
- Hive参数调优
调优 Hive提供三种可以改变环境变量的方法,分别是: (1)修改${HIVE_HOME}/conf/hive-site.xml配置文件: 所有的默认配置都在${HIVE_HOME}/conf/hiv ...
- Python深拷贝与浅拷贝区别
可变类型 如list.dict等类型,改变容器内的值,容器地址不变. 不可变类型 如元组.字符串,原则上不可改变值.如果要改变对象的值,是将对象指向的地址改变了 浅拷贝 对于可变对象来说,开辟新的内存 ...
- centOS如何灵活管理服务进程
1.将程序跑起来,且关闭会话时程序仍在运行. nohup node index.js & (头部加了nohup,表示在你退出帐户或关闭终端之后继续运行相应的进程;尾部的&表示在后台执 ...
- jQuery基础之表单验证
在使用jquery-validate.js插件时可以做一些初始化配置在初始化jquery-validate.js对象的时候,将外部的一些配置和该插件内部的一些默认配置合并在一起,如果有相同的配置,前者 ...
- 用两种以上的 方式实现一个方法或者对象,调用时打印"你好xx",已定义的代码不能做修改,自己编译的不能出现"你好"? (Javasctript)
先上代码 const obj = { say(){ Array.from(arguments).forEach(item=>{ console.log(`${this.str} ${item}` ...
- Cesium专栏-空间分析之剖面分析(附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- Xcode报错:could not attach to pid:"1764"
这种错误不是什么问题,按照参考链接操作即可,亲测有效: https://www.cnblogs.com/luorende/p/6295945.html 在运行项目时出现了如下错误 (基本上重新启动项目 ...
- css权重问题
权重决定了你css规则怎样被浏览器解析直到生效.“css权重关系到你的css规则是怎样显示的 权重记忆口诀.从0开始,一个行内样式+1000,一个id+100,一个属性选择器/class或者伪类+10 ...