c++ 全排列問題


題目描述

排列,一般地,從n個不同元素中取出m(m≤n)個元素,按照一定的順序排成一列,叫做從n個元素中取出m個元素的一個排列(Arrangement)。特別地,當m=n時,這個排列被稱作全排列(Permutation)。

現給一個正整數( 1 < = n < = 8 ),輸出所有全排列。

例如n=3,輸出所有組合,並且按字典序輸出:

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

每個全排列一行,相鄰兩個數用空格隔開(最后一個數后面沒有空格)

輸入

輸入一個整數n

輸出

輸出所有的全排列,每個排列占一行,同一個排列中,兩個數之間用一個空格隔開。

樣例輸入

3

樣例輸出

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

Source Code

#include <iostream>//頭文件
#include <string.h>//
using namespace std;//
bool used[10];//這個組合曾經有過(是否重復)
int ans[10];//排列出來的數
int n;//
void dfs(int u)//dfs函數
{
    if(u == n + 1)//如果滿足3個數據,則輸出
    {
        for (int i = 1;i <= n;i ++)//
            printf("%d ",ans[i]);//ans[i]就是輸出數據里面的第i個
        printf("\n");
        return ;    
    }
    for (int i = 1;i <= n;i ++)
        if(used[i] == 0)//如果i沒有被選中
        {
            ans[u] = i;//如果沒有被選中,就把i放到ans[]中
            used[i] = 1;//used[2] = 1表示2這個數已經被選過了  used[3] = 1表示3這個數已經被選過了
            dfs(u + 1);//繼續選下一個數字  dfs(1):選第1個數  dfs(2):選第2個數  dfs(n + 1):打印,退出
            used[i] = 0;//打印完畢,把該數字取消
        }
}
int main()
{
    memset(used,0,sizeof(used));
    cin >> n;
    dfs(1);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM