给定一系列串,实现全排列,每个串中的元素个数不要求相同,详见示例:
//---------------------------------------------------------------------------------------------------------------------
//功能:全排列组合,数组里面数字1---9是合法元素,数字0只是为了数组占位,比如:串<5,6,7>中有三个
// 元素参加全排列,而<2,0,0>中只有一个元素参加全排列。
//描述:算法使用两个堆栈倒换元素,避免了多层循环嵌套和递归调用
//......懒得排版了,数组定义写成伪代码形式
char chList[][3] = <1,2,3> <2,0,0> <5,6,7> <6,0,0> <5,2,0> <2,3,0>
size_t iElemCount[] = <3,1,3,1,2,2> //chList中有效字符个数
std::vector<CString> strListA;
std::vector<CString> strListB;
bool bTurnToA = false;
for (int i = 0; i < iElemCount[0]; i++)
{
strListA.push_back((CString)chList[0][i]);
}
// strTextBlank.GetLength() 其实就是chList 的 第一维个数
for (int i = 1; i < strTextBlank.GetLength(); i++)
{
if (bTurnToA)
{
strListA.clear();
for (int j = 0; j < iElemCount[i]; j++)
{
for (int k = 0; k < strListB.size(); k++)
{
strListA.push_back(strListB[k] + chList[i][j]);
}
}
}
else
{
strListB.clear();
for (int j = 0; j < iElemCount[i]; j++)
{
for (int k = 0; k < strListA.size(); k++)
{
strListB.push_back(strListA[k] + chList[i][j]);
}
}
}
bTurnToA = !bTurnToA;
}
//---------------------------------------------------------------------------------------------------------------------
最近在网上看到一强人m选n排列组合算法,很有创意,欣赏一下:
算法的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。然后从左到右扫描数组元素值的“10”组合,找
到第一个“10”组合后将其变为 “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。当第一个“1”移动
到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。
例如求5中选3的组合:
1 1 1 0 0 //1,2,3
1 1 0 1 0 //1,2,4
1 0 1 1 0 //1,3,4
0 1 1 1 0 //2,3,4
1 1 0 0 1 //1,2,5
1 0 1 0 1 //1,3,5
0 1 1 0 1 //2,3,5
1 0 0 1 1 //1,4,5
0 1 0 1 1 //2,4,5
0 0 1 1 1 //3,4,5