dfs方法类似于搜索树,能取则向下搜索,不能取则回溯寻找另一个结点。
#include <iostream>
using namespace std;
#define MAXN 20
int n,top;
int visited[MAXN]={}; //标志位
int array[MAXN]; //存储输入的排列数
int s[MAXN]; //栈
void init(){
for(int i=0;i<MAXN;i++)
visited[i]=0; //初始标志位全为0
}
void dfs(int ith){
if(ith==n){ //如果增量等于n,则形成一种排列
for(int i=0;i<top;i++)
cout<<s[i]; //打印栈元素
cout<<endl;
}
for(int i=0;i<n;i++){
if(visited[i]==0){
visited[i]=1; //如果位置为0,则置一表明该位置元素需要入栈
s[top++]=array[i]; //对应array位置的元素入栈
dfs(ith+1); //递归增量+1
top--; //回溯,栈指针减一
visited[i]=0; //标志位恢复原始值
}
}
}
int main()
{
init();
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>array[i]; //从1到n的序列
top=0; //栈顶
dfs(0);
return 0;
}