关于回溯与n个数的全排列

  今天要讲的题目是全排列的问题:有1、2、3、...、n这样一个数列,要求输出其全排列。

  那么,显然,这道题目非常之简单,用一个标志数组变量,标记数字的使用情况,然后根据它挑选数字即可。由于题目很简单,在这就不多说了,来看看代码:

 1 #include<stdio.h>
 2 int n;
 3 int sum=0;//统计方法数 
 4 int a[10001]={0};//用于储存答案 
 5 int flag[10001]={0};//所有数字的标志变量初始化为0 
 6 void out();//函数用于输出 
 7 void f(int k);//函数用于求解 
 8 int main()
 9 {
10     scanf("%d",&n);
11     f(0);
12     return 0;
13 }
14 void f(int k)
15 {
16     int i;
17     for(i=1;i<=n;i++)
18     {
19         if(flag[i]==0)//如果i没有被使用过 
20         {
21             a[k]=i;//则选中i 
22             flag[i]=1;//标记i为已使用 
23             if(k==(n-1))//如果找到了所有n位数 
24                 out();//输出 
25             else    
26                 f(k+1);//否则继续寻找下一位 
27             flag[i]=0;//返回时还原现场 
28             a[k]=0;
29         }
30     }
31 }
32 void out()
33 {
34     int i;
35     sum++;//每执行一次该函数则说明有一个解 
36     printf("%d:
",sum);
37     for(i=0;i<n;i++)
38         printf("%d ",a[i]);
39     printf("
");
40 }

  代码如有不足,欢迎指教!

原文地址:https://www.cnblogs.com/LegendLa/p/4534030.html