lsmCC 发表于 2023-10-30 19:28:42

修改代码使能能全排列

#include <bits/stdc++.h>
using namespace std;
vector<int>a;
vector<vector<int>>nums;
int main()
{
   int n,x;
   cin>>n;
   for(int i=0;i<n;i++)
   {
    cin>>x;
    a.push_back(x);

   }
do
{
    nums.push_back(a);
} while (next_permutation(nums.begin(),nums.end()));
for(int i=0;i<nums.size();i++)
{
    for(int j=0;j<nums.size();j++)
    {
      cout<<nums<<endl;
    }
}

   


   
}

isdkz 发表于 2023-10-30 19:29:19

你需要修改代码,使其能够输出给定数组的全排列。

下面是修改后的代码:

#include <bits/stdc++.h>
using namespace std;

vector<int> a;
vector<vector<int>> nums;

void permute(vector<int>& arr, int l, int r) {
    if (l == r) {
      nums.push_back(arr);
      return;
    }
    for (int i = l; i <= r; i++) {
      swap(arr, arr[ i]);
      permute(arr, l + 1, r);
      swap(arr, arr[ i]);
    }
}

int main()
{
    int n, x;
    cin >> n;
    for (int i = 0; i < n; i++) {
      cin >> x;
      a.push_back(x);
    }

    permute(a, 0, n - 1);

    for (int i = 0; i < nums.size(); i++) {
      for (int j = 0; j < nums[ i].size(); j++) {
            cout << nums[ i] << " ";
      }
      cout << endl;
    }

    return 0;
}


这里我们使用了递归的方式来生成给定数组的全排列。 permute函数接受一个数组arr ,以及当前要处理的起始位置l和结束位置r 。当l等于r时,表示已经生成了一个全排列,将其加入到nums中。否则,我们从l到r的位置依次选择一个元素,将其与l位置的元素交换,然后递归处理剩余的元素,最后再将交换的元素还原回来。

在main函数中,我们读取输入的数组,并调用permute函数生成全排列。最后,我们遍历nums并输出每个全排列。

希望能帮到你!如果有任何问题,请随时问我。
页: [1]
查看完整版本: 修改代码使能能全排列