問題出自linux C 壹站式編程網站,定義壹個數組,編程打印它的全排列
程序的主要思路是:
1.把第1個數換到最前面來(本來就在最前面),準備打印1xx,再對後兩個數2和3做全排列。
2.把第2個數換到最前面來,準備打印2xx,再對後兩個數1和3做全排列。
3.把第3個數換到最前面來,準備打印3xx,再對後兩個數1和2做全排列。
可見這是壹個遞歸的過程,把對整個序列做全排列的問題歸結為對它的子序列做全排列的問題,註意我沒有描述Base Case怎麽處理,妳需要自己想。妳的程序要具有通用性,如果改變了N和數組a的定義(比如改成4個數的數組),其它代碼不需要修改就可以做4個數的全排列(***24種排列)。
解題過程:
1.當N = 1的時候,則直接打印數列即可。
2.當N = 2的時候,設數組為 [a, b]
打印a[0], a[1] (即a,b)
交換a[0],a[1]裏面的內容
打印a[0],a[1] (此時已變成了[b, a] )
3.當N = 3的時候,數組為 [a, b, c]
3.1把a放在 a[0] 的位置(原本也是如此,a[0] = a[0]),打印b,c的全排列(即a[1], a[2]的全排列)
3.2把b放在a[0]的位置(這時候需要交換原數組的a[0]和a[1]),然後打印a, c的全排列,打印完後再換回原來的位置,即a還是恢復到a[0],b還恢復到a[1]的位置
3.3把c放在a[0]的位置(這時候需要交換的是原數組的a[0]和a[2]),然後打印a, b的全排列,打印完後再換回原來的位置,即a還是恢復到a[0],b還恢復到a[1]的位置
至此,全排列完成
當 N = 4,5,6,……的時候,以此類推。
程序代碼:
#include <stdio.h>
#define N 3
int a[N];
void perm(int);
void print();
void swap(int, int);
int main()
{
int i,n;
int offset;
for(i = 0; i<N; i++)
a[i] = i + 97;
perm(0);
}
void perm(int offset)
{
int i, temp;
if(offset == N-1)
{
print();
return;
}
for(i = offset; i < N; i++)
{
swap(i, offset);
perm(offset + 1);
swap(i, offset);
}
}
void print()
{
int i;
for(i = 0; i < N; i++)
printf(" %c ",a[i]);
printf("\n");
}
void swap(int i, int offset)
{
int temp;
temp = a[offset];
a[offset] = a[i];
a[i] = temp;
}