首页 > 技术文章 > 洛谷P1706 全排列问题

zch061023 2022-03-15 21:49 原文

题目描述

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

输入格式

一个整数 n。

输出格式

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

每个数字保留 个场宽。

输入输出样例

输入 #1
3
输出 #1
    1    2     3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

说明/提示

1n9。

先看代码

 1 #include<iostream>
 2 using namespace std;
 3 int n;
 4 int used[101],judge[101];
 5 void print(){
 6     for(int i=1;i<=n;i++)
 7     {
 8         printf("%5d",used[i]);
 9     }
10     cout<<endl;
11 }
12 void search(int x)
13 {
14     if(x==n){
15         print();
16         return;
17     }
18     for(int i=1;i<=n;i++)
19     {
20         if(!judge[i])
21         {
22             judge[i]=1;
23             used[x+1]=i;
24             search(x+1);
25             judge[i]=0;
26         }
27     }
28 }
29 int main()
30 {
31     scanf("%d",&n);
32     search(0);
33     return 0;
34 }

这题一看就是用dfs啦,首先先建两个数组,一个是要输入的,另一个是用来做标记的

我们·先定义一个输出格式提前准备,后定义一个dfs,和老套路一样,先建出口,在进行满足条件的递归,因为有很多个答案,所以别忘回溯,最后输出就好啦

推荐阅读