这里的n是不确定的。
实现的功能描述如下:
1. 有一个字符串的矩阵,用vector< vector< CStirng > > 表示
2. 行与行之间进行排列组合
3. 输出所有组合的方式
int loop( VEC_DYADIC_STRING vecDyadic, // 字符串矩阵
int& nMax, // 记录未遍历的行号
int& nCurDeep, // 当前行数(也可以称为深度)
VEC_INT& vecInt, // 记录所有行号
VEC_INT& vecInt2 ) // 记录每一行选中的
{
vecInt.push_back( nCurDeep );
for ( UINT i = 0; i < vecDyadic[nCurDeep].size(); i++ )
{
if ( nMax > 1 ) // 如果不是最后一行
{
nMax--;
nCurDeep++;
vecInt2.push_back( i );
loop( vecDyadic, nMax, nCurDeep, vecInt, vecInt2 );
}
else
{
//char* pData;
//USES_CONVERSION;
//pData = T2A( vecDyadic[nCurDeep][i] );
for ( UINT j = 0; j < vecInt2.size(); j++ )
{
cout<<vecDyadic[vecInt[j]][vecInt2[j]]<<_T( " " );
}
cout<<vecDyadic[nCurDeep][i]<<endl;
nOutNum++; // 全局变量,记录循环的次数,也就是排列组合的次数。
}
}
deleteVecBehindSepVal( vecInt, nCurDeep ); // 最后一层for循环执行完毕,需要回到上一层,上一层的循环数加1,这需要修改Vector中保存的记录,所以需要将该层(包括该层)之后的记录删除。
nMax++;
nCurDeep--;
deleteVecBehindSepVal( vecInt2, nCurDeep ); // 同理
return 0;
}
deleteVecBehindSepVal是自定义的函数,Function is 删除Vector中指定位置之后的元素。
经测试,对于字符串矩阵
Apple Orange banana
car bus taxi bicycle
basketball football badminton tennis volleyball
共输出60条记录。
源代码参考: 我的资源 递归实现n重循环