14-Si

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

全排列问题

题目描述

按照字典序输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数n

输出格式

由1 ~ n组成的所有不重复的数字序列,每行一个序列。

每个数字保留5个场宽。

样例输入

3

样例输出

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

思路

深搜,记录每个数的状态和当前是第多少个数,每完成一组就进行回溯,可以保证是按字典序输出且不重复

#include<bits/stdc++.h>
using namespace std;
int n;
int p[10];
int ans[10];

void print()
{
    for(int i = 0; i < n; i++){
        printf("%5d", ans[i]);
    }
    printf("\n");
}

void dfs(int now)
{
    if(now == n){
        print();
    }
    for(int i = 1; i <= n; i++){
        if(!p[i]){
            ans[now] = i;
            p[i] = 1;
            dfs(now + 1);
            p[i] = 0;
        }
    }
}

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

posted on 2022-10-26 20:30  14-Si  阅读(68)  评论(0编辑  收藏  举报