搜索_DFS_全排列
2018-02-13 22:34
260 查看
全排列是什么?
比如1 2 3 这三个数的全排列是:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
用DFS生成一个序列的全排列很方便也很简单.
同样, 用搜索树的概念去理解这样的一个过程
时间复杂度为O(n!)
一道全排列的问题
基本是裸的回溯了
全排列是没有重复的, 考虑另一种情况, 有重复元素的排列
把vis[]去掉即可, 因为vis的作用就是限制只能选一次的
还有, 加上超范围跳出函数
之前的程序不用加, 是因为之前所有的数都会排列, 全部vis置一之后就结束了
比如1 2 3 这三个数的全排列是:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
用DFS生成一个序列的全排列很方便也很简单.
同样, 用搜索树的概念去理解这样的一个过程
时间复杂度为O(n!)
一道全排列的问题
基本是裸的回溯了
#include <bits/stdc++.h> using namespace std; int n, vis[10] = {}; vector <int> vec; void dfs(int t) { if(t == n + 1) { for(int i = 0; i < n; ++i) { printf(" %d", vec[i]); } cout << endl; } for(int i = 1; i <= n; ++i) { if(vis[i]) continue; vis[i] = 1; vec.push_back(i); dfs(t+1); vis[i] = 0; vec.pop_back(); } } int main() { cin >> n; dfs(1); }
全排列是没有重复的, 考虑另一种情况, 有重复元素的排列
把vis[]去掉即可, 因为vis的作用就是限制只能选一次的
还有, 加上超范围跳出函数
之前的程序不用加, 是因为之前所有的数都会排列, 全部vis置一之后就结束了
#include <bits/stdc++.h> using namespace std; int n, vis[10] = {}; vector <int> vec; void dfs(int t) { if(t == n + 1) { for(int i = 0; i < n; ++i) { printf(" %d", vec[i]); } cout << endl; } for(int i = 1; i <= n; ++i) { if(vis[i]) continue; vis[i] = 1; vec.push_back(i); dfs(t+1); vis[i] = 0; vec.pop_back(); } } int main() { cin >> n; dfs(1); }
相关文章推荐
- dfs深度优先搜索 1~N 的排列理解dfs,抽象为n个数放n个盒子
- UVA 725 除法(DFS搜索排列)
- DFS搜索排列与组合
- hdu 1716 排列2(DFS搜索)
- HDOJ-1501 字符排列问题[字符搜索DFS()]
- [DFS]最简题-搜索字母排列
- hdu 1716 排列2(DFS搜索)
- zoj2110 Tempter of the Bone 搜索dfs
- 杭电-N皇后问题(经典DFS搜索)
- hdu1372 dfs搜索之国际象棋的马
- 用BFS和DFS解决圆盘状态搜索问题
- 【dfs搜索】NOIP2011day3 Mayan游戏
- 暴力搜索求0--9全排列的第n个
- 深度优先搜索DFS
- 深度搜索dfs感悟
- nyoj 325 dfs 搜索平分问题
- nyoj82寻宝迷宫(一)搜索DFS
- DFS-求全排列
- 【DFS】CODE[VS] 1294 全排列(刷题记录)
- 排列搜索-c#求解-英雄会在线编程题目