c++递归学习全组合排列



c++递归学习全组合排列

Sample Input

3

1 2 3

Sample Output

123

132

213

231

312

321

[cpp] view plaincopy


  1. #include <iostream>
  2. using namespace std;
  3. const int len = 10;
  4. int n;
  5. int mat[len];
  6. int result[len];
  7. bool used[len]; //初始值为false,表示都没有使用过
  8. void solve(int level);
  9. int main()
  10. {
  11.     cin>>n;
  12.     for (int i=0;i<n;i++)
  13.     {
  14.         cin>>mat[i];
  15.     }
  16.     solve(0);
  17.     system(“pause”);
  18.     return 0;
  19. }
  20. /*———————-
  21. 操作的目的:普通选择性组合排列
  22. 初始条件:
  23.     n:记录选取数据的总位数
  24.     mat数组:存储选取数据
  25.     used数组:标记是不是用过
  26.     result数组:存储已得到的结果
  27. 操作结果:
  28.     输出result数组,所有的选择性组合排列
  29. 函数参数:
  30.     level:既代表递归的层次,也代表result数组已经处理到第几位了
  31.     一句话就是:把没用过的数放到result数组的第level位上
  32. ————————*/
  33. void solve(int level)
  34. {
  35.     if (level == n)
  36.     {
  37.         for (int i=0;i<n;i++)
  38.         {
  39.             cout<<result[i];
  40.         }
  41.         cout<<endl;
  42.     }
  43.     else
  44.     {
  45.         for (int i=0;i<n;i++) //这里的for循环是从0开始的,与例子的输出是对应的
  46.         {
  47.             if (!used[i])//条件成立,没有用过
  48.             {
  49.                 result[level]=mat[i];
  50.                 used[i]=true;//标记已经用过
  51.                 solve(level+1);
  52.                 used[i]=false;
  53.             }
  54.         }
  55.     }
  56. }

注意:根据实例知,输出数据的时候,总是把所有数据都用过一边,无论该数字是在自己之前还是之后。

体现在具体的代码是在:

1、检测是不是被用过,这里引入used数组

2、递归入口的for循环中,for (int i=0;i<n;i++) 这里的for循环是从0开始的,也就是说每次往数组result中填数据的时候,都会查找一边数组mat,把每一个没用过的元素都用过一遍。