回溯(深度优先搜索)

在力扣的题解上看到一篇题解,里面提到了回溯类题目的判断方式,于是直接稍微做了一点关于回溯的题,得出了一些做题经验。

一、如何判断一个题目是否涉及回溯?

回溯题目判断方法

本学期第一次做到的回溯的题目是洛谷的P1036《选数》


P1036

我不清楚这道题是否存在数学上的公式通解,见到这种题目,在题目输入的数据量不大的情况下,我一般都是会直接想办法生成全组合,然后判断筛选出符合条件的答案。

除此之外,蓝桥杯模拟赛上有两道填空题如果是编程题的话也是可以用到回溯的。


括号
排列

以上我们做过的三道题都和回溯有关,都是可以通过生成全组合得出答案的。而第一题是求解的个数,其余两个是求解的详细信息。

二、回溯怎么写?

我们先看一下以上三道题的递归函数
(1)选数


来自题解

(2)合法括号


括号

(3)字母排序
字母排序

可以看出一些问题:

1、三个题目的函数都是有共通之处的,参数都有left_number(括号那题是left,代表左括号数量),表示递归时当前的数据离结果还有次递归,都有start和end,表示本次函数的初始要处理的数据和结束的条件,函数内部第一部分肯定是跳出条件。

2、《选数》和《字母排序》函数内部都有一个for循环,但《合法括号》里没有,为什么呢?因为《合法括号》和另外两题不一样,另外两个题目需要把结果组合出来,再判断,而《合法括号》这一题是先判断再组合。所以有没有for循环,需要根据题目而定。

3、如果是求解的个数,那么只需要一个int变量就行了,而如果是求所有解的详细信息,就需要一个res数组来存储满足条件的信息。

4、函数第一部分是跳出条件,第二部分是调用自己的方式。

5、根据不同的题目和解题的方法,调用自己的方式也不一样。

含for循环的递归函数基本固定会有三个参数(递归的深度)、(开头)、(结尾),递归的深度是便于递归函数条件判断跳出,调用自己的时候递归深度一般要减一,结尾的作用是循环次数上限,递归深度这个参数目前我做过的题来讲作用基本都是固定的,结尾这个参数可能有些题目会动态判断循环结束动态上限,但我还没有遇见过。

就这三道题来讲start这个参数意义在《选数》中和在《字母排序》中是两种意思,在《选数》中意味着这是循环的开始,因为选数这题 1+3和3+1是一个意思,所以记录下循环的开始,就不会有组合重复的情况发生,但《字母排序》中,ab和ba是两种组合,如果还是从start开始的话ab和ba就只能出现其中一种了,所以要从0开始循环,start是记录上次找到的字母的坐标,表示已经组合的字符串是以这个字符作为结尾,这次循环要排除掉它。

以上这些都要根据具体情况具体分析。

三、具体说一些这三道题的递归思路。

《选数》:
这个请直接看题解https://www.luogu.com.cn/problemnew/solution/P1036

《合法括号》:
这道题的关键是,如何才能知道一个嵌套括号是不是合法的。
这个如果无法从数学角度想清楚,至少也能通过观察例子的规律来得出结论。
我们可以手算穷举出:
()只有两种组合()、)(,其中 )( 是不合法的。
(())有六种组合(())、()()、())( 、 )(()、() )(、 ) )((,后四种都是不合法的。通过观察我们可以知道,不合法的括号组合只有一种规律,任意一个右括号,其左边的括号数都小于右边(包括自己)的括号数。
所以,判断条件只有一个,即每一次组合的时候,当前的结果左括号的数量一定要多于右边括号的数量,如果等于就加左括号。在左右括号数量都达到上限就存进数组里面。由于递归条件自带筛选效果,所以无需加额外判断。

《字母排序》:
这道题很简单,就是穷举,先找字符串的第一个字母,然后第一个字母固定,从头开始找下一个字母,循环条件每一次都是从0开始,选过的字母,在完整字符串参数上将那个字母赋值为‘?’,传递给下个函数,后面遇见‘?’时跳过。这种做法,如果字符串中出现重复的字符,就会出现重复的字符串,用set容易去掉重复的字符串,然后用迭代器计算set容器里成员的数量即可。我不知道是否有在循环时就筛选掉重复的字符串的方法,从而避免使用set。

一些比较复杂涉及到数学的题目,如:


hdoj2063

在数据量不大的情况下,是可以避免求公式,用回溯通解的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容