标签:blog os io for ar 2014 cti div
/********************************************************************
@file Main_practise.cpp
@date 2014-8-14
@author Tiger
@brief 全排列
由于采用非递归的C++函数来输出n个元素的所有排列方式很困难,
所以可以开发一个递归函数来实现。令E={e1,...,en}表示n个元素
的集合,我们的目标是生成该集合的所有排列方式。令Ei为E中移
去元素i以后所获得的集合,perm(X)表示集合X中元素的排列方式,
ei.perm(X)表示在perm(X)中的每个排列方式的前面均加上ei以后所
得到的排列方式。例如,如果E={a,b,c},那么E1={b,c},perm(E1)=(bc,cb),
e1.perm(E1)=(abc,acb)。对于递归的基本部分,采用n=1。当只有一
个元素时,只可能产生一种排列方式,所以perm(E)=(e),其中e是
E中的唯一元素。当n>1时,perm(E)=e1.perm(E1)+e2.perm(E2)+e3.perm(E3)+ ? +en.perm(En)。
这种递归定义形式是采用n个perm(X)来定义perm (E), 其中每个X包含n-1个元素。
至此,一个完整的递归定义所需要的基本部分和递归部分都已完成。
当n=3并且E=(a,b,c)时,按照前面的递归定义可得perm(E)=a.perm({b,c})+b.perm({a,c})+c.perm({a,b})。
同样,按照递归定义有perm({b,c})=b.perm({c})+c.perm({b}), 所以
a.perm({b,c})=ab.perm({c})+ac.perm({b})=ab.c+ac.b=(abc,acb)。同理可得
b.perm({a,c})=ba.perm({c})+bc.perm({a})=ba.c+bc.a=(bac,bca),
c.perm({a,b})=ca.perm({b})+cb.perm({a})=ca.b+cb.a=(cab,cba)。
所以perm(E)=(abc,acb,bac,bca,cab,cba)。
********************************************************************/
#include <iostream>
const int SIZE = 5;
template <typename T>
void CalFullArray(T array[], int nBeg, int nEnd);
template <typename T>
void Swap(T& a, T& b);
int main(int argc, const char* argv[])
{
int array[SIZE] = {1, 2, 3, 4, 5};
CalFullArray(array, 0, SIZE-1);
system("pause");
return 0;
}
template <typename T>
void CalFullArray(T array[], int nBeg, int nEnd)
{
if (nBeg == nEnd)
{
for (int i=0; i<=nEnd; ++i)
{
std::cout << array[i];
}
std::cout << std::endl;
}
else
{
for (int i=nBeg; i<=nEnd; ++i)
{
Swap(array[nBeg], array[i]);
CalFullArray(array, nBeg+1, nEnd);
Swap(array[nBeg], array[i]);
}
}
}
template <typename T>
void Swap(T& a, T& b)
{
int temp = a;
a = b;
b = temp;
}
标签:blog os io for ar 2014 cti div
原文地址:http://www.cnblogs.com/roronoa-zoro-zrh/p/3911784.html