dfs中return回溯问题
题目:
从1到n中选k个数进行排列
首先我们看这段代码:
#include <iostream>
using namespace std;
int n, k;
const int N = 1010;
int a[N];
bool st[N];void dfs(int u) {if (u == k + 1) {for (int i = 1; i <= k; i++) {cout << a[i] << " ";}cout << endl;return ;}for (int i = 1; i <= n; i++) {if (!st[i]) {st[i] = true;a[u] = i;dfs(u + 1);st[i] = false;}}
}int main() {cin >> n >> k;dfs(1);return 0;
}
这段代码,把return去掉是不会有任何问题的,现在我们来看下面这段代码:
#include <iostream>
using namespace std;
int n, k;
const int N = 1010;
int a[N];
bool st[N];void dfs(int u) {if (u > k + 1) {for (int i = 1; i <= k; i++) {cout << a[i] << " ";}cout << endl;return ;}for (int i = 1; i <= n; i++) {if (!st[i]) {st[i] = true;a[u] = i;dfs(u + 1);st[i] = false;}}
}int main() {cin >> n >> k;dfs(1);return 0;
}
这段代码如果我们把return去掉,就会出现结果不对的问题,原因是什么呢???
是终止条件的不同。
第一个代码的条件是u==k+1,而第二个代码的条件是u >k+1,那么当我们都把return 去掉时,第二个代码中的
for (int i = 1; i <= n; i++) {if (!st[i]) {st[i] = true;a[u] = i;dfs(u + 1);st[i] = false;}
此时继续dfs,那么u继续+1,举个例子,本来u=2,k = 1,u已经比k大了,输出一次结果,此时你不回溯,那么for循环继续,u+1,u = 3,u还是比k大,那么又会重新打印刚刚的结果,可是第一种情况,因为你的判断条件是u==k+1,u = 2,k = 1,符合条件,此时如果不回溯,u+1,u = 3,u!=k+1,就不会重新打印结果,所以最后答案是一样的,但是事实上dfs的次数变多了。
dfs中return回溯问题相关推荐
- DFS中的回溯法(纯暴力穷举)
首先回溯法是深度搜索(DFS)的一种,即把所有可能穷举,根据条件筛选出符合条件的路径. 回溯法模板格式 dfs(...){//根据递归终止条件进行筛选 if(符合需要的条件){存储合理路径 retur ...
- 岛屿问题,矩阵:DFS+标记剪枝+回溯
深度优先搜索: 可以理解为暴力法遍历矩阵中所有字符串可能性.DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推. 剪枝: 在搜索中,遇到 这条路不可能和目标字符串匹配成 ...
- 回溯算法:从电影蝴蝶效应中学习回溯算法的核心思想
回溯算法:从电影<蝴蝶效应>中学习回溯算法的核心思想 数独.八皇后.0-1背包.图的着色.旅行商问题.全排列问题都能用到 理解"回溯算法" 回溯的思想,类似枚举搜索,枚 ...
- mysql中leave和_MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法
本文主要向大家介绍了MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. DELIMITER ...
- return true Java_[Java教程]js中return,return true,return false的用法及区别
[Java教程]js中return,return true,return false的用法及区别 0 2015-11-16 23:00:03 1.语法及返回方式 ①返回控制与函数结果 语法为:retu ...
- C#中return语句的使用方法
C#中return语句的使用方法 return语句终止它所在的方法的执行,并将控制权返回给调用方法,另外,它还可以返回一个可选值.如果方法为void类型,则可以省略return语句. return语句 ...
- python if写在return 后面_python中return如何写
python中return的用法 1.return语句就是把执行结果返回到调用的地方,并把程序的控制权一起返回 程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return ...
- java中demo接人_return的用法_如何理解java中return的用法?
C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...
- php return直接输出,PHP中return用法详细解读
原标题:PHP中return用法详细解读 在大部分编程语言中,return关键字可以将函数的执行结果返回,PHP中return的用法也大同小异,对初学者来说,掌握PHP中return的用法也是学习PH ...
最新文章
- PHP远程下载图片损坏问题
- [YTU]_2445(C++习题 输入输出--公用继承)
- 服务器会自动创建cookie,网站的cookie机制是什么
- 你可能需要了解一下的中台
- Java笔试之Singleton
- [SHELL]监控LINUX目录文件变化
- SPH(光滑粒子流体动力学)流体模拟实现:算法总览
- groovy和java结合使用
- node中的异步API
- M1卡说明及使用proxmark3破解方法
- 蓝桥杯 ADV-104算法提高 打水问题
- wifi已连接不可上网服务器无响应,wifi已连接不可上网是什么原因?
- matlab矩阵特征值分解,矩阵特征值分解与奇异值分解含义解析及应用
- 为什么有些公司不招大龄程序员?
- 【Java】Response约定
- android中的高级组件(三)(ExpandableListView,ImageSwitcher,Gallery)
- 蓝牙技术|防丢背包获奖,Find My产品受追捧
- Java Selenium3 WebDriver启动火狐、Chrome、IE,Edge浏览器的方法(一)
- (WPF)连锁超市收银系统总结
- JAVA 如何使用File类创建文件,文件夹