C語(yǔ)言實(shí)現(xiàn)全排列算法模板的方法
程序的主要思路是:
1.把第1個(gè)數(shù)換到最前面來(lái)(本來(lái)就在最前面),準(zhǔn)備打印1xx,再對(duì)后兩個(gè)數(shù)2和3做全排列。
2.把第2個(gè)數(shù)換到最前面來(lái),準(zhǔn)備打印2xx,再對(duì)后兩個(gè)數(shù)1和3做全排列。
3.把第3個(gè)數(shù)換到最前面來(lái),準(zhǔn)備打印3xx,再對(duì)后兩個(gè)數(shù)1和2做全排列。
可見(jiàn)這是一個(gè)遞歸的過(guò)程,把對(duì)整個(gè)序列做全排列的問(wèn)題歸結(jié)為對(duì)它的子序列做全排列的問(wèn)題,注意我沒(méi)有描述Base Case怎么處理,你需要自己想。你的程序要具有通用性,如果改變了N和數(shù)組a的定義(比如改成4個(gè)數(shù)的數(shù)組),其它代碼不需要修改就可以做4個(gè)數(shù)的全排列(共24種排列)。
解題過(guò)程:
1.當(dāng)N = 1的時(shí)候,則直接打印數(shù)列即可。
2.當(dāng)N = 2的時(shí)候,設(shè)數(shù)組為[a, b]
打印a[0], a[1] (即a,b)
交換a[0],a[1]里面的內(nèi)容
打印a[0],a[1] (此時(shí)已變成了[b, a] )
3.當(dāng)N = 3的時(shí)候,數(shù)組為[a, b, c]
3.1把a(bǔ)放在a[0] 的位置(原本也是如此,a[0] = a[0]),打印b,c的全排列(即a[1], a[2]的全排列)
3.2把b放在a[0]的位置(這時(shí)候需要交換原數(shù)組的a[0]和a[1]),然后打印a, c的全排列,打印完后再換回原來(lái)的位置,即a還是恢復(fù)到a[0],b還恢復(fù)到a[1]的位置
3.3把c放在a[0]的位置(這時(shí)候需要交換的是原數(shù)組的a[0]和a[2]),然后打印a, b的全排列,打印完后再換回原來(lái)的位置,即a還是恢復(fù)到a[0],b還恢復(fù)到a[1]的位置
至此,全排列完成
當(dāng) N = 4,5,6,……的時(shí)候,以此類(lèi)推。
#include <stdio.h>
/************************************************************************/
/* 功能:實(shí)現(xiàn)兩個(gè)整形參數(shù)值交換
/* 參數(shù):
/* lhs--int類(lèi)型的指針,指向待交換數(shù)1的地址
/* rhs--int類(lèi)型的指針,指向待交換數(shù)2的地址
/************************************************************************/
void Swap(int *lhs, int *rhs)
{
int t = *lhs;
*lhs = *rhs;
*rhs = t;
}
/************************************************************************/
/* 功能:實(shí)現(xiàn)全排列功能
/* 參數(shù):
/* source--整數(shù)數(shù)組,存放需要全排列的元素
/* begin --查找一個(gè)排列的開(kāi)始位置
/* end --查找一個(gè)排列的結(jié)束位置,當(dāng)begin=end時(shí),表明完成一個(gè)排列
/************************************************************************/
void FullPermutation(int source[], int begin, int end)
{
int i;
if (begin >= end) // 找到一個(gè)排列
{
for (i = 0; i < end; i++)
{
printf("%d", source[i]);
}
printf("\n");
}
else// 沒(méi)有找完一個(gè)排列,則繼續(xù)往下找下一個(gè)元素
{
for (i = begin; i < end; i++)
{
if (begin != i)
{
Swap(&source[begin], &source[i]); // 交換
}
// 遞歸排列剩余的從begin+1到end的元素
FullPermutation(source, begin + 1, end);
if (begin != i)
{
Swap(&source[begin], &source[i]); // 回溯時(shí)還原
}
}
}
}
int main()
{
int source[30];
int i, count;
scanf("%d", &count);
// 初始化數(shù)組
for (i = 0; i < count; i++)
{
source[i] = i + 1;
}
FullPermutation(source, 0, count);
return 0;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++訪問(wèn)注冊(cè)表獲取已安裝軟件信息列表示例代碼
這篇文章主要介紹了c++通過(guò)讀取注冊(cè)表獲得本機(jī)已安裝軟件信息的方法,大家參考使用吧2013-11-11

