天天看點

NYOJ-366 D的小L 全排列

D的小L

時間限制: 4000 ms  |  記憶體限制: 65535 KB 難度: 2  

描述
      一天TC的匡匡找ACM的小L玩三國殺,但是這會小L忙着哩,不想和匡匡玩但又怕匡匡生氣,這時小L給匡匡出了個題目想難倒匡匡(小L很D吧
NYOJ-366 D的小L 全排列
),有一個數n(0<n<10),寫出1到n的全排列,這時匡匡有點囧了
NYOJ-366 D的小L 全排列
,,,聰明的你能幫匡匡解圍嗎?  
輸入
第一行輸入一個數N(0<N<10),表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個整數x(0<x<10)
輸出

按特定順序輸出所有組合。

特定順序:每一個組合中的值從小到大排列,組合之間按字典序排列。

樣例輸入
2
2
3      
樣例輸出
12
21
123
132
213
231
312
321
      
1 /* 功能Function Description:      NYOJ-366 全排列問題
 2    開發環境Environment:           DEV C++ 4.9.9.1
 3    技術特點Technique:
 4    版本Version:
 5    作者Author:                    可笑癡狂
 6    日期Date:                      20120802
 7    備注Notes:
 8 */
 9 
10 
11 //代碼一:---STL
12 #include<iostream>
13 #include<algorithm>
14 using namespace std;
15 
16 int main()
17 {
18     int T,i,n;
19     int a[9]={1,2,3,4,5,6,7,8,9};
20     cin>>T;
21     while(T--)
22     {
23         cin>>n;
24     //    sort(a,a+n);   每次開始之前不用重新排列,因為生成所有全排列之後雖然跳出了do循環但是數組又回到了初始的升序狀态
25         do
26         {
27             for(i=0;i<n;++i)
28                 cout<<a[i];
29             cout<<endl;
30         }while(next_permutation(a,a+n));
31         /*
32             for(i=0;i<9;++i)
33                 cout<<a[i];   //測試跳出循環後輸出1 2 3 4 5 6 7 8 9 即又回到了初始升序的狀态
34         */
35     }
36     return 0;
37 }
38 
39 
40 
41 
42 //代碼二:----遞歸+回溯
43 #include<iostream>
44 #include<cstring>
45 using namespace std;
46 
47 bool visit[10];
48 int n,a[10];
49 
50 void fun(int k)
51 {
52     int i;
53     if(k==n)
54     {
55         for(i=0;i<n;++i)
56             cout<<a[i];
57         cout<<endl;
58     }
59     else
60     {
61         for(i=1;i<=n;++i)
62             if(!visit[i])
63             {
64                 a[k]=i;
65                 visit[i]=true;
66                 fun(k+1);
67                 visit[i]=false;
68             }
69     }
70 }
71 
72 int main()
73 {
74     int T;
75     cin>>T;
76     while(T--)
77     {
78         memset(visit,false,sizeof(visit));
79         cin>>n;
80         fun(0);
81     }
82     return 0;
83 }