nyoj 366 D的小L 【全排列&&必須記住】

D的小L

時間限制:4000 ms  |  內存限制:65535 KB
難度:2
描述
      一天TC的匡匡找ACM的小L玩三國殺,但是這會小L忙着哩,不想和匡匡玩但又怕匡匡生氣,這時小L給匡匡出了個題目想難倒匡匡(小L很D吧),有一個數n(0<n<10),寫出1到n的全排列,這時匡匡有點囧了,,,聰明的你能幫匡匡解圍嗎?
輸入
第一行輸入一個數N(0<N<10),表示有N組測試數據。後面的N行輸入多組輸入數據,每組輸入數據都是一個整數x(0<x<10)
輸出
按特定順序輸出所有組合。
特定順序:每一個組合中的值從小到大排列,組合之間按字典序排列。
樣例輸入
2
2
3
樣例輸出
12
21
123
132
213
231
312
321

代碼1STL:

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define O_O(x) while(x--)
using namespace std;

int main()
{
    int t;
    SI(t);
    int pp[9]={1,2,3,4,5,6,7,8,9};
    O_O(t)
    {
        int n;
        scanf("%d",&n);
        sort(pp,pp+n);
        do{
            for(int i=0;i<n;i++)
                printf("%d",pp[i]);
            puts(" ");
        }while(next_permutation(pp,pp+n));
    }
    return 0;
}

代碼2(遞歸):


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<cstdlib>
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define O_O(x) while(x--)
using namespace std;
bool vis[10];
int n,pp[10];

void fun(int id)
{
    int i;
    if(id==n)
    {
        for(i=0;i<n;i++)
            printf("%d",pp[i]);
        puts(" ");
    }
    else {
        for(i=1;i<=n;i++)
            if(!vis[i])
        {
            pp[id]=i;
            vis[i]=true;
            fun(id+1);
            vis[i]=false;
        }
    }
}

int main()
{
    int t;
    SI(t);
    O_O(t)
    {
       mem(vis,false);
       SI(n);
       fun(0);
    }
return 0;
}



發佈了201 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章