使用深度优先搜索
/* 套用深度优先搜索之全排列 全排列 输入: n(<=26) 输出:将 前n个小写字母全排列输出 */ #include "stdafx.h" #include <iostream> #include <string> #include <vector> using namespace std; int gN; const int MAX_ELEMENT = 10000; char solution[MAX_ELEMENT]; int selected[26]; int gCurNum; int gSolCount; void PrintSolution() { for (int i = 0;i < gN;i++) { cout << solution[i] << " "; } cout << endl; } void Go() { if (gCurNum == gN) { gSolCount ++; PrintSolution(); return; } for (char c = 'a';c < 'a' + gN;c++ ) { if (selected[c] == 0) { gCurNum++; solution[gCurNum - 1] = c; selected[c] = 1; Go(); gCurNum --; selected[c] = 0; } } } int _tmain(int argc, _TCHAR* argv[]) { gN = 9; memset(selected,0,sizeof(selected)); gCurNum = 0; gSolCount = 0; Go(); cout << gSolCount << endl; }
还有一个比较巧妙的递归版本
void Swap(char & a,char &b) { char t = a; a = b; b = t; } void Permutation(char * pElement,int N,int startIdx) { if (startIdx == N) { gSolCount ++; //PrintElement(pElement,N); return; } Permutation(pElement,N,startIdx + 1); for (int i = startIdx + 1;i < N;i++) { Swap(pElement[startIdx],pElement[i]); Permutation(pElement,N,startIdx + 1); Swap(pElement[startIdx],pElement[i]); } } void TestPermutation() { gN = 9; gSolCount = 0; char elements[26]; for (int i = 0;i<gN;i++) { elements[i] = 'a' + i; } Permutation(elements,gN,0); cout << gSolCount << endl; }