全排列問題

2021-08-18 12:20:49 字數 1151 閱讀 2233

一般把1~n(n<=9)這n個整數按某種順序擺放的結果稱為這n個整數的乙個排列,而全排列指這n個整數所能形成的所有排列。現在需實現按字典序從小到大的順序輸出1~n的全排列。

從遞迴的角度去考慮,如果把問題描述成「輸出1~n這n個整數的全排列」,那麼它就可以被分解成若干個子問題:「輸出以1開頭的全排列」「輸出以2開頭的全排列」……「輸出以n開頭的全排列」。於是不妨假設乙個陣列p,用於存放當前的排列;再設定乙個雜湊陣列hashtable,其中hashtable[x]當整數x已在陣列中時為true。

現在按順序往p的第一位到第n位填入數字。不妨假設當前已經填好了p[1]~p[index-1],正準備填p[index]。顯然需要列舉1~n,如果當前列舉的數字x還沒有在p[1]~p[index-1]中(即hashtable[x]==false),那麼就把它填入p[index],同時將hashtable[x]置為true,然後處理p的第index+1位(即進行遞迴);而當遞迴完成時,再講hashtable[x]還原為false,以便讓p[index]處理下乙個數字。

那遞迴邊界是什麼呢?顯然,當index達到n+1時,說明p的第1~n位都已經填好了,此時可以把陣列p輸出,表示生成了乙個排列,然後直接return即可。

#include "stdafx.h"

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 11;

int n, p[maxn], hashtable[maxn] = ;

static

int count = 0;

void generatep(int index)

cout

<< endl;

::count+=1;//防止與std裡面的count衝突

}for (int x = 1; x <= n; x++)//列舉1~n,試圖將x填入p[index]

}}int main()

執行結果如圖所示:

全排列問題

一 全排列問題演算法描述如下 舉例 345的全排列分別為 345 354 435 453 534 543,可見將整組數中的所有的數分別與第乙個數交換,這樣就總是在處理後n 1個數的全排列。又舉例 45的全排列有 45 54 可見將第乙個數分別與後面的數交換後輸出即為45的全排列。所以,對於乙個很長一...

全排列問題

題目描述814 全排列問題 鍵盤輸入n 1 n 10 個字元,輸出輸出其全排序。第一行為字元個數k,第二行為k個字元,不用空格隔開。輸出其每種排列佔一行,各字元間用一空格隔開。樣例輸入 3abc 樣例輸出 a b c a c b b a c b c a c b a c a b includeint ...

全排列問題

全排列就是從第乙個數字起 每個數分別與它後面的數字交換 用c 寫乙個函式,如 foo const char str 列印出 str 的全排列,如 abc 的全排列 abc,acb,bca,dac,cab,cba。第一種方法 用遞迴 不包含有重複數字或字元出現的情況 void swap char a,...