题目来自网络
题目(1)给出位数和进制数,顺序输出所有数
举例:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
代码:
#include <iostream>
using namespace std;
void Combine(int nArr[],int nMax,int nLen,int nStart)
{
if (nStart == nLen)
{
for (int i = 0;i < nLen;i++)
{
cout<<nArr[i]<<" ";
}
cout<<endl;
return;
}
for (int i = 0;i < nMax;i++)
{
nArr[nStart] = i;
Combine(nArr,nMax,nLen,nStart + 1);
}
}
int main()
{
int nArr[10];
int nLen = 3;//长度
int nMax = 2;//2进制
Combine(nArr,nMax,nLen,0);
system("pause");
return 1;
}
题目(2)所有元素的全排列(元素不重叠)
举例:
1 2 31 3 2
2 1 3
2 3 1
3 2 1
3 1 2
代码:
#include <iostream>
using namespace std;
void Swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void Perm(int nArr[],int nLen,int nStart)
{
if (nStart == nLen )//本次递归处理第nStart位
{
for (int i = 0;i < nLen;i++)
{
cout<<nArr[i]<<" ";
}
cout<<endl;
return;
}
for (int i = nStart;i < nLen;i++)
{
swap(nArr[nStart],nArr[i]);
Perm(nArr,nLen,nStart + 1);
swap(nArr[nStart],nArr[i]);
}
}
int main()
{
int nArr[3] = {1,2,3};
Perm(nArr,3,0);
system("pause");
return 1;
}
题目(3)所有元素的全排列(元素可以重叠)
举例:
2 2 3
2 3 2
3 2 2
代码:
#include <iostream>
using namespace std;
void Swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
bool IsSwap(int nArr[],int nStart,int nEnd,int nNum)
{
for (int i = nStart;i <= nEnd;i++)
{
if (nNum == nArr[i])
{
return false;
}
}
return true;
}
void Perm(int nArr[],int nLen,int nStart)
{
if (nStart == nLen )
{
for (int i = 0;i < nLen;i++)
{
cout<<nArr[i]<<" ";
}
cout<<endl;
return;
}
for (int i = nStart;i < nLen;i++)
{
if (i == nStart || IsSwap(nArr,nStart,i - 1,nArr[i]))
{
swap(nArr[nStart],nArr[i]);
Perm(nArr,nLen,nStart + 1);
swap(nArr[nStart],nArr[i]);
}
}
}
int main()
{
//int nArr[3] = {1,2,3};
int nArr[3] = {2,2,3};
//int nArr[3] = {2,3,2};
//int nArr[3] = {3,2,2};
//int nArr[3] = {1,1,1};
Perm(nArr,3,0);
system("pause");
return 1;
}
题目(4)部分元素的全排列(元素不重叠)
举例:
1 2
1 3
1 4
2 3
2 4
3 4
代码:
#include <iostream>
using namespace std;
void Swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void Perm(int nArr[],int nLen,int nResultLen,int nStart,int nNext)
{
if (nStart == nResultLen)
{
for (int i = 0;i < nStart;i++)
{
cout<<nArr[i]<<" ";
}
cout<<endl;
}
for (int i = nNext;i < nLen;i++)
{
Swap(nArr[nStart],nArr[i]);
Perm(nArr,nLen,nResultLen,nStart + 1,i + 1);
Swap(nArr[nStart],nArr[i]);
}
}
int main()
{
int nLen = 4;
int nResult = 2;
int nArr[4] = {1,2,3,4};
Perm(nArr,nLen,nResult,0,0);
system("pause");
return 1;
}
题目(5)组合(元素不重复)
举例:
输入数组:1,2,3
输出结果:
1
1 2
1 2 3
1 3
2
2 3
3
代码:
#include <iostream>
using namespace std;
void Swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void Perm(int nArr[],int nLen,int nStart,int nNext)
{
for (int i = 0;i < nStart;i++)
{
cout<<nArr[i]<<" ";
}
cout<<endl;
for (int i = nNext;i < nLen;i++)
{
Swap(nArr[nStart],nArr[i]);
Perm(nArr,nLen,nStart + 1,i + 1);
Swap(nArr[nStart],nArr[i]);
}
}
int main()
{
//int nArr[4] = {1,2,3,4};
//Perm(nArr,4,0,0);
int nArr[3] = {1,2,3};
Perm(nArr,3,0,0);
system("pause");
return 1;
}
题目(6)组合(元素可能重复)
举例:
输入数组:3,1,1
输出结果:
3
3 1
3 1 1
1
1 1
代码:
#include <iostream>
using namespace std;
void Swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
bool IsSwap(int nArr[],int nStart,int nEnd,int nNum)
{
for (int i = nStart;i <= nEnd;i++)
{
if (nNum == nArr[i])
{
return false;
}
}
return true;
}
void Perm(int nArr[],int nLen,int nStart,int nNext)
{
for (int i = 0;i < nStart;i++)
{
cout<<nArr[i]<<" ";
}
cout<<endl;
for (int i = nNext;i < nLen;i++)
{
if (i == nNext || IsSwap(nArr,nNext,i - 1,nArr[i]))
{
Swap(nArr[nStart],nArr[i]);
Perm(nArr,nLen,nStart + 1,i + 1);
Swap(nArr[nStart],nArr[i]);
}
}
}
int main()
{
//int nArr[3] = {1,2,3};
//int nArr[3] = {1,1,3};
//int nArr[3] = {1,3,1};
int nArr[3] = {3,1,1};
//int nArr[3] = {1,1,1};
Perm(nArr,3,0,0);
system("pause");
return 1;
}