DFS搜索排列与组合
来源:互联网 发布:淘宝上网络解锁可靠吗 编辑:程序博客网 时间:2024/06/06 03:13
练习使用DFS搜索12以内的五位数字的排列例如
1 2 3 4 51 2 3 4 6.........12 11 10 9 712 11 10 9 8
利用数学排列与组合方法可知结果为12*11*10*9*8 = 95040
主要就是用到一个数组记录访问的状态,利用一个solve()函数存储搜索结果,中间有很多小坑,自己慢慢踩吧,附上本人渣代码。
这种也可以不用for循环初状态,main函数直接一个DFS即可,更加的简洁,但是遍历棋盘的还是循环初状态比较好。第二个是后期的简洁版的DFS代码。(2017/3/25)
#include <iostream>using namespace std;int num[5] = { 0 }; //存储遍历的数字bool idx[13] = { false }; //存储访问的状态int count = 0;void solve(){ for (int i = 0; i < 5; i++) { cout << num[i] << " "; } count++; cout << endl;}void dfs(int i, int k){ if (i <= 0 || i >= 13) //越界条件 { return; } idx[i] = true; //用过的数字状态为true num[k - 1] = i; if (k == 5) //返回条件 { solve(); return; } for (int x = 1; x <= 12; x++) { if (idx[x] == false) { idx[x] = true; dfs(x, k + 1); idx[x] = false; } }}int main(){ for (int i = 1; i <= 12; i++) { dfs(i, 1); idx[i] = false; //这一步非常关键,因为这个位置调试了两天,开始的第一个数字用过之后一定要更改状态 } cout << "count: " << count << endl; return 0;}
//更为简洁的DFS搜索#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>using namespace std;int n, m;int num[10];bool idx[10];void dfs(int n_, int m_){ if (m_ == m) { for(int i=0; i<m;i++) cout<<num[i]; return; } for (int x = 0; x <= n; x++) { if (idx[x] == false) { idx[x] = true; num[m_] = x; dfs(x, m_ + 1); idx[x] = false; } }}void init(){ for (int i = 1; i <= n; i++) idx[i] = false;}int main(){ // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while (~scanf("%d%d", &n, &m) && (m || n)) { init(); dfs(n, 0); } return 0;}
搜索组合的DFS
#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>using namespace std;int n, m;int number[10];void dfs(int pos, int num){ if (num == m) { for (int i = 0; i < m; i++) cout << number[i] << " "; cout << endl; } for (int k = pos; k <= n; k++) { number[num] = k; dfs(k + 1, num + 1); }}void init(){ memset(number, 0, sizeof(number));}int main(){ freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); while (~scanf("%d%d", &n, &m) && (m || n)) { init(); dfs(1, 0); } return 0;}
0 0
- DFS搜索排列与组合
- 排列、组合、递归、搜索
- dfs 生成排列和组合
- [DFS]最简题-搜索字母排列
- 蓝桥杯 排列数(DFS搜索)
- 排列与组合---回溯
- 排列与组合
- 排列与组合
- 排列与组合读书笔记
- 排列与组合小结
- 排列与组合问题
- 排列与组合问题
- 排列与组合
- 排列与组合
- 排列与组合算法
- 排列与组合算法
- 字符串排列与组合
- “排列与组合”笔记
- Android布局优化之Include(一)
- Java之多线程下载工具类
- 第一次编译AOSP简单流程
- 表格数据的上移与下移功能
- 计算机文化基础—IT概论
- DFS搜索排列与组合
- sky patch 简单试用
- 终端,进程组,作业,会话及作业控制
- 系统集成项目管理工程师教程看书笔记6
- maven如何手动将jar包放到本地仓库
- vs2010设置AStyle
- 经典递归(排队买票)
- 平板上的战舰
- Mybatis逆向工程,生成Mapper