全排列问题
全排列问题
题目描述:
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入
n(1≤n≤9)
输出
由1~n组成的所有不重复的数字序列,每行一个序列。(每一个数占5个字符)
样例输入
3
样例输出
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
这道题是经典的深搜入门题。首先,我们的数组是空的,就往里面扔数,然后我们每放一个数,就将这个数所在的下标标记,然后递归放下一个字符,
如果数组满了,就输出这一组解,然后回溯,就是还原现场,重新将数组清空,再递归算出下一种情况,知道遍历了所有情况,就结束。代码如下:
#include<iostream> using namespace std; int n,a[101],b[101]; void print() //输出函数 { for(int i=1;i<=n;i++) { cout<<" "<<a[i]; } cout<<endl; } void dfs(int i) //第i层,把数据放在这一层 { int j; if(i==n+1) //如果到了第n+1层就代表深搜完毕,直接输出 { print(); return; //返回上一层 } for(j=1;j<=n;j++) { if(b[j]==0) { a[i]=j; //盛放这个数 b[j]=1; //标记已经被放过了 dfs(i+1); //放第i+1层 b[j]=0; //回溯 } } } int main() { cin>>n; dfs(1); //开始深搜 return 0; }