全排列问题

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

一种处理数据的常用策略
这里运用dfs搜索回溯的方式解决
当然也可以直接调用全排列函数next_permutation()

#include<iostream>

using namespace std;

int ans[10],vis[10],n; 

void DFS(int x)
{
    if(x==n)//边界
    {
        for(int i=0;i<n;++i)
        {
            printf("%5d",ans[i]);
        }
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;++i)
    {
        if(vis[i]==0)//看此数是否已被调用
        {
            vis[i]=1;//标记
            ans[x]=i;
            DFS(x+1);
            vis[i]=0;//回溯
        }
    }
}

int main()
{
    cin>>n;
    
    DFS(0);
    
    return 0;
} 

 

posted @ 2022-08-23 11:40  Cirpt  阅读(44)  评论(0)    收藏  举报