全排列问题

全排列问题

题目描述:

输出自然数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;
 } 

 

posted @ 2022-08-23 16:37  为么要取名字  阅读(37)  评论(0编辑  收藏  举报