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


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

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

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

  • 相关阅读:
    cogs1538 [AHOI2005]LANE 航线规划
    cogs468 [NOI2010]超级钢琴
    [国家集训队2011]数颜色
    动态点分治总结
    点分治总结
    数论知识总结-欧拉函数
    BZOJ2683 简单题
    COGS1871 [国家集训队2011]排队(魏铭)
    LUOGU3278 [SCOI2013]多项式的运算
    BZOJ4491 我也不知道题目名字是什么
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/4378444.html
Copyright © 2020-2023  润新知