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

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

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

 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>改成其他对应类型就行了。没怎么使用过模板,因而此处就不使用了。

 

posted on 2015-03-30 16:33  darkknightzh  阅读(282)  评论(0编辑  收藏  举报

导航