用C++寫一個函數, 如 Foo(const char *str), 打印出 str 的全排列,
如 abc 的全排列: abc, acb, bca, dac, cab, cba !
本人收集解法(聲明不是我做的哈!)
void chang(char str[],int m)
/*定義循環左移函數(我沒有用左移函數)*/
{
int i,j;
char temp=str[0];
for (i=0;i<m;i++) str[i]=str[i+1];
str[i]=temp;
}
void pai(char str[],int m,int n) /*定義全排列函數*/
{
int k;
void chang(char str[],int m);
if (m<n) /* 定 義 遞 歸 調 用 出 口 */
{
for (k=0;k<=m;k++)
{
pai(str,m+1,n); /*遞歸調用*/
chang(str,m); /*調用左移函數*/
}
}
else printf("%s/t",str);
}
#include "stdio.h"
main()
{char str[]="ABCD";
/*全排列字符,可以任意多個(相應的下面排列函數中參數"4"改成全排列字符的個數)*/
clrscr();
pai(str,0,4);
/*這裏參數0(下標)表示從第一個元素開始,4表示元素個數(不是下標)*/
getch();
}
/*********************************************/
下面我來解釋一下,我花了近1天的時間,找到這樣一個規律如下:
┏ ABCD
┣ BCDA
┏ ABCD ━┫
┃ ┣ CDAB
┏ ABCD ━╋ BCAD ┗ DABC
┃ ┃ .
┃ ┗ CABD .
ABCD ━┫ .
┃ ┏ BACD .
┃ ┃ .
┗ BACD ━╋ ACBD ┏ CBAD
┃ ┣ BADC
┗ CBAD ━┫
┣ ADCB
┗ DCBA
簡化圖如下所示 ==>
┏ ABCD
┣ BCDA
┏ ABC ━┫
┃ ┣ CDAB
┏ AB ━╋ BCA ┗ DABC
┃ ┃ .
┃ ┗ CAB .
A ━┫ .
┃ ┏ BAC .
┃ ┃ .
┗ BA ━╋ ACB ┏ CBAD
┃ ┣ BADC
┗ CBA ━┫
┣ ADCB
┗ DCBA