(原)给定输入,输出全排列

以前的时候的面试题,然后被鄙视了。

题目就是给定一系列数字,输出这些数字的全排列(不一定是数字)。下面的代码只当数字来处理。

 1 // 计算全排列的递归调用函数

 2 vector<vector<int> >  FullPermutation(vector<int> &vectin, int arrayinnum)

 3 {

 4 

 5     if (arrayinnum == 1)

 6     {

 7         vector<vector<int> > arrayout(1);

 8         arrayout[0].resize(1);

 9         arrayout[0].at(0) = vectin.at(0);

10         vectin.erase(vectin.begin());

11         return arrayout;

12     }

13     else

14     {

15         vector<vector<int> > vecttemp = FullPermutation(vectin, arrayinnum - 1);

16         vector<vector<int> > vectout(arrayinnum * vecttemp.size());

17 

18         int i = 0;

19         for (vector <vector <int> >::iterator iter = vecttemp.begin(); iter < vecttemp.end(); iter++)

20         {

21             for (int j = 0; j < arrayinnum; j++)

22             {

23                 vectout[i] = *iter;

24                 vectout[i].insert(vectout[i].begin() + j, vectin.front());

25                 i++;

26             }

27         }

28 

29         vectin.erase(vectin.begin());

30         vecttemp.clear();

31         return vectout;

32     }

33 }

34 

35 // 得到全排列的函数

36 vector<vector<int> > getFullPermutation(int* datain, int datanum)

37 {

38     vector<int> vectin(datanum);

39     for (int i = 0; i < datanum; i++)

40     {

41         vectin.at(i) = datain[i];

42     }

43 

44     vector<vector<int> > vectout = FullPermutation(vectin, datanum);

45 

46     vectin.clear();

47 

48     return vectout;

49 }

下面是测试函数:

 1 int _tmain(int argc, _TCHAR* argv[])

 2 {

 3     const int num = 4;

 4     int arrayin[num] = {1, 2,3,4};

 5     

 6     vector<vector<int> > perRes = getFullPermutation(arrayin, num);

 7 

 8     for (vector <vector <int> >::iterator iter = perRes.begin(); iter < perRes.end(); iter++)

 9     {

10         for (vector <int>::iterator it = (*iter).begin(); it < (*iter).end(); it++)

11         {

12             cout << *it << " ";

13         }

14         cout << endl;

15     }

16 

17     perRes.clear();

18 

19     return 0;

20 }

上面测试函数的结果:

 1 4 3 2 1

 2 3 4 2 1

 3 3 2 4 1

 4 3 2 1 4

 5 4 2 3 1

 6 2 4 3 1

 7 2 3 4 1

 8 2 3 1 4

 9 4 2 1 3

10 2 4 1 3

11 2 1 4 3

12 2 1 3 4

13 4 3 1 2

14 3 4 1 2

15 3 1 4 2

16 3 1 2 4

17 4 1 3 2

18 1 4 3 2

19 1 3 4 2

20 1 3 2 4

21 4 1 2 3

22 1 4 2 3

23 1 2 4 3

24 1 2 3 4

测试函数改成如下:

 1     const int num = 3;

 2     int arrayin[num] = {1, 2,3};

 3     

 4     vector<vector<int> > perRes = getFullPermutation(arrayin, num);

 5 

 6     for (vector <vector <int> >::iterator iter = perRes.begin(); iter < perRes.end(); iter++)

 7     {

 8         for (vector <int>::iterator it = (*iter).begin(); it < (*iter).end(); it++)

 9         {

10             cout << *it << " ";

11         }

12         cout << endl;

13     }

14 

15     perRes.clear();

运行结果如下:

1 3 2 1

2 2 3 1

3 2 1 3

4 3 1 2

5 1 3 2

6 1 2 3

说明:

1 不太会使用vector,当做是练手。

2 此程序没有处理有重复的数字的情况。

3 如果改成其他类型,也可以,只需要把vector<int>改成其他对应类型就行了。没怎么使用过模板,因而此处就不使用了。

 

你可能感兴趣的:(全排列)