一、全排列
void perm(vector<int> &veNum, int iPos)
{
if (iPos == veNum.size())
{
copy(veNum.begin(), veNum.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
else
{
for (int i = iPos; i < veNum.size(); ++i)
{
int iTmp = veNum[i];
veNum[i] = veNum[iPos];
veNum[iPos] = iTmp;
perm(veNum, iPos + 1);
iTmp = veNum[i];
veNum[i] = veNum[iPos];
veNum[iPos] = iTmp;
}
}
}
void perm()
{
vector<int> veNum = { 1,2,3,4 };
perm(veNum, 0);
}
二、打印集合的所有子集
使用两个数组,一个待打印的集合,一个是标记数组。
void all_perm(vector<int> &veAll, vector<int> &veTwo, int n, int len)
{
if (n == len)
{
for (int i = 0; i < veTwo.size(); ++i)
{
if (veTwo[i] == 1)
cout << veAll[i] << " ";
}
cout << endl;
}
else
{
veTwo[n] = 1;
all_perm(veAll, veTwo, n+1, len);
veTwo[n] = 0;
all_perm(veAll, veTwo, n+1, len);
}
}
void all_perm()
{
int iNum = 4;
vector<int> veAll;
for (int i = 0; i < iNum; ++i)
veAll.push_back(i + 1);
vector<int> veTwo;
veTwo.resize(iNum);
all_perm(veAll, veTwo, 0, iNum);
}
三、打印集合的所有子集并指定最长打印长度
void all_perm(vector<int> &veAll, vector<int> &veTwo, int n, int len, int count, int allcount)
{
if (n == len)
{
if (count > allcount)
return;
for (int i = 0; i < veTwo.size(); ++i)
{
if (veTwo[i] == 1)
cout << veAll[i] << " ";
}
cout << endl;
}
else
{
veTwo[n] = 1;
all_perm(veAll, veTwo, n+1, len, count+1, allcount);
veTwo[n] = 0;
all_perm(veAll, veTwo, n+1, len, count, allcount);
}
}
void all_perm()
{
int iNum = 4;
int iPrint = 2; //打印的子集最大长度
vector<int> veAll;
for (int i = 0; i < iNum; ++i)
veAll.push_back(i + 1);
vector<int> veTwo;
veTwo.resize(iNum);
all_perm(veAll, veTwo, 0, iNum, 0, iPrint);
}