本文索引目录:

一、回溯算法的基本思想以及个人理解

二、“子集和”问题的解空间结构和约束函数

三、一道经典回溯法题点拨升华回溯法思想

四、结对编程情况

一、回溯算法的基本思想以及个人理解

  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 八皇后升级版)的更多相关文章

  1. 『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)

    本文索引目录: 一.动态规划的基本思想 二.数字三角形.最大子段和(PTA)递归方程 三.一道区间动态规划题点拨升华动态规划思想 四.结对编程情况 一.动态规划的基本思想: 1.1 基本概念: 动态规 ...

  2. 『嗨威说』算法设计与分析 - 贪心算法思想小结(HDU 2088 Box of Bricks)

    本文索引目录: 一.贪心算法的基本思想以及个人理解 二.汽车加油问题的贪心选择性质 三.一道贪心算法题点拨升华贪心思想 四.结对编程情况 一.贪心算法的基本思想以及个人理解: 1.1 基本概念: 首先 ...

  3. 『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)

    本文索引目录: 一.PTA实验报告题1 : 数字三角形 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 最大子段和 2.1 实践题目 ...

  4. 『嗨威说』算法设计与分析 - STL中Sort函数的实现原理初探

    本文索引目录: 一.对Sort算法实现的个人阅读体会 二.Sort算法使用的三个排序算法的优点介绍 2.1 插入排序的优缺点 2.2 堆排序的优缺点 2.3 快速排序的优缺点 2.4 新的结合排序—— ...

  5. 『嗨威说』算法设计与分析 - PTA 程序存储问题 / 删数问题 / 最优合并问题(第四章上机实践报告)

    本文索引目录: 一.PTA实验报告题1 : 程序存储问题 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 删数问题 2.1 实践题目 ...

  6. 『嗨威说』常见的C++函数模板整理(一)

    开学两天,身上的职责直接变为两个班班长,三个小组组长,哇这事情估计够我忙活了,想躲都躲不掉啊,看来我还是真招人推荐各种管理职务啊,以后要是有人推荐我当经理啊领导啊该多好哈哈哈哈.记得今天奶奶生日,很开 ...

  7. 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划

    由于种种原因(看这一章间隔的时间太长,弄不清动态规划.分治.递归是什么关系),导致这章内容看了三遍才基本看懂动态规划是什么.动态规划适合解决可分阶段的组合优化问题,但它又不同于贪心算法,动态规划所解决 ...

  8. 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)

    PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...

  9. 算法设计与分析 - AC 题目 - 第 2 弹

    PTA-算法设计与分析-AC原题7-1 最大子列和问题 (20分)给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 ...

随机推荐

  1. avd manger创建的虚拟机启动不起来,或者启动起来后黑屏

    最近鼓捣安卓虚拟机,整的都差点重装系统,刚开始下载了genymotion_vbox,装完以后要在vbox中导入一个虚拟机,结果我导入完,虚拟机怎么也启动不了,然后各种找办法无果,最后重启电脑发现电脑也 ...

  2. idea中导入别人的vue项目并运行

    1. 下载node.js 在搭建vue的开发环境之前,先下载node.js,下载地址:https://nodejs.org/en/ https://blog.csdn.net/antma/articl ...

  3. 面试知识点 html css(经常更新)

    1.HTML5语义化 什么是语义化 用合理.正确的标签来展示内容,比如h1~h6定义标题 好处 易于用户阅读,样式丢失的时候能让页面呈现清晰的结构. 有利于SEO,搜索引擎根据标签来确定上下文和各个关 ...

  4. SVM算法核函数的选择

    SVM支持向量机,一般用于二分类模型,支持线性可分和非线性划分.SVM中用到的核函数有线性核'linear'.多项式核函数pkf以及高斯核函数rbf. 当训练数据线性可分时,一般用线性核函数,直接实现 ...

  5. Git详细学习教程

    作者:gafish https://github.com/gafish/gafish.github.com Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目 ...

  6. Thinkphp 5.1.24 parseKey缺陷导致聚合注入 分析

    测试url: http://127.0.0.1/thinkphp/thinkphp_5.1.24/public/index.php/index/index/sqli2?id=2 控制器是获取id参数作 ...

  7. TortoiseSVN 无法查看日志 日期显示1970-01-01的解决方案

    对有问题的目录, 在右键菜单中, 使用 TortoiseSVN 的 Revision Graph 命令, 等待该命令执行完毕, 再重新使用 Show Log 命令, 即可查看日志了

  8. JS基础语法---(数据)简单类型和复杂类型

    原始数据类型: number, string, boolean, undefined, null, object 基本类型(简单类型), 即值类型: number, string, boolean 复 ...

  9. ebs oracle YTD期间费用

    select PERIOD_NAME, SEGMENT3, SEGMENT3_DESC, sum(case when SEGMENT2 = '1011' then ACCOUNTED_ACCRUAL ...

  10. arcgis api 4.x for js 基础工具篇之测距测面

    前言 在搭建好WebGIS应用框架的时候,相信大家首先开发的都会是基础功能,此篇文章我们主要讲述的是“测距”."测面"功能. 注* 在测量单位中常规都是基于"平面坐标系& ...