比较简单的一个dfs ,但是要求输出搜索路径,(也就是全排序)下面给出三种方法,1、用到交换字符,2、用到dfs搜索,3、stl自带的一个全排序函数
//#include<iostream> //using namespace std; /* 用到交换字符 http://wenku.baidu.com/view/cb26288dd0d233d4b14e69bd.html void permutation(int* a,int k,int m) { if(k == m) { for(int i=1;i<=m;i++) cout<<a[i]; cout<<endl; } else { for(int j=k;j<=m;j++) { swap(a[j],a[k]); permutation(a,k+1,m); swap(a[j],a[k]); } } } int main() { int a[11] ={0,1,2,3,4,5,6,7,8,9,}; permutation(a,1,3); return 0; } */ /* 深度优先搜索 int vis[11]={0};//存储走过标记 int b[11];//存储走过的数字 int n;//全局数字 void dfs(int c) { int i,j; if(n == c) { for(i=0;i<n;i++) cout<<b[i]; cout<<endl; } else { for(j=1;j<=n;j++) { if(!vis[j]) { vis[j]=!vis[j]; b[c]=j; dfs(c+1); vis[j]=!vis[j]; } } } } int main() { int N; cin>>N; while(N--) { cin>>n; dfs(0); } return 0; }*/ //STL自带函数 http://www.slyar.com/blog/stl_next_permutation.html #include <iostream> #include <algorithm> #include <string> using namespace std; int main() { int N,n; cin>>N; while(N--) { cin>>n; string str; for(int i=1;i<=n;i++) str+=(i+'0'); cout<<str<<endl; while (next_permutation(str.begin(), str.end())) { cout << str << endl; } } return 0; }
19:
#include<iostream> using namespace std; //深度优先搜索 int vis[11]={0};//存储走过标记 int b[11];//存储走过的数字 int n,m;//全局数字 void dfs(int c)//c用来记录用来排序的个数 { if(c == m)//当个数满足选择的要求个数时就输出 { for(int i=0;i<m;i++) cout<<b[i]; cout<<endl; } else { for(int i=1;i<=n;i++)//从第一个开始找.. { if(!vis[i])//找到没有用过的 { vis[i]=!vis[i];//标记为用过的 b[c]=i;//并且把这个数存入 dfs(c+1);//再从这里开始进入下一个数字的搜索 vis[i]=!vis[i];//一轮搜索完毕把标记用过的标记回没用过的,再返回for从下一个i开始找 } } } } int main() { int N; cin>>N; while(N--) { cin>>n>>m; dfs(0); } return 0; }