21xrx.com
2024-12-28 11:28:39 Saturday
登录
文章检索 我的文章 写文章
C++实现全排列生成
2023-07-03 12:21:55 深夜i     --     --
C++ 全排列 生成

全排列是指由给定的一组数列中,按照一定的顺序, 选取其中所有的数所能构成的不同顺序序列。C++可以通过递归实现全排列生成。

首先,定义一个函数next_permutation,它的作用是在当前数列中寻找下一个字典序更大的排列。如果找到了,则返回true;否则,返回false。该函数的实现如下:

bool next_permutation(vector & nums) {

  int i = nums.size() - 2;

  while (i >= 0 && nums[i] >= nums[i + 1])

    i--;

  if (i < 0)

    return false;

  int j = nums.size() - 1;

  while (j > i && nums[j] <= nums[i])

    j--;

  swap(nums[i], nums[j]);

  reverse(nums.begin() + i + 1, nums.end());

  return true;

}

接下来,我们可以使用递归函数实现全排列生成。假设当前已经确定了前i-1个数的位置,接下来需要确定第i个数的位置。我们可以将第i个数与i到n之间的任意一个位置上的数交换,然后递归处理前i+1个数。在递归过程中,我们需要不断调用next_permutation函数,以找到当前数列中的下一个排列。当处理完前n个数时,就可以得到所有的全排列。

void permute(vector & nums, int start, vector >& result) {

  if (start == nums.size()) {

    result.push_back(nums);

    return;

  }

  for (int i = start; i < nums.size(); i++) {

    swap(nums[start], nums[i]);

    if (next_permutation(nums.begin() + start + 1, nums.end())) { //每次调用next_permutation函数,找到当前数列的下一个排列

      permute(nums, start + 1, result);

    }

    swap(nums[start], nums[i]);

  }

}

int main() {

  vector nums = 3;

  vector > result;

  permute(nums, 0, result);

  return 0;

}

上述代码中,首先将数列nums和起始位置0作为参数传给permute函数,然后通过递归来生成所有的全排列,将结果保存在二维向量result中。最终输出result,即可得到所有的全排列。

使用C++实现全排列生成,可以方便地用来解决许多实际问题,如数独等谜题的求解。而递归函数结合next_permutation函数的应用,也是一个常见的算法技巧。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复