You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中生成数组排列并固定元素2和23的位置?

问题分析

你的代码出现重复输出,核心问题是递归循环范围包含了23和2的固定位置,而且交换判断逻辑绕得太复杂——就算你想跳过固定元素,当前的条件还是会让递归过程重复处理相同的排列状态,自然就会输出重复结果。

正确的做法是只针对需要排列的可变元素(也就是3、1、4这三个,对应原数组的索引0、3、4)做全排列,23和2的位置全程不动,这样既不会破坏固定要求,也不会产生重复。

修正后的代码
#include <iostream>
using namespace std;

void printingArr(int arr[], int size) {
    for (int i = 0; i < size; i++)
        cout << arr[i] << " ";
    cout << endl;
}

// 只处理可变位置的元素排列,indices存的是需要排列的元素索引
void permuteVariable(int arr[], int indices[], int n) {
    if (n == 1) {
        printingArr(arr, 5);
        return;
    }
    for (int j = n - 1; j >= 0; j--) {
        swap(arr[indices[j]], arr[indices[n-1]]);
        permuteVariable(arr, indices, n - 1);
        swap(arr[indices[j]], arr[indices[n-1]]);
    }
}

int main() {
    int arr[] = {3, 23, 2, 1, 4};
    // 明确指定需要排列的元素索引:0(3)、3(1)、4(4)
    int variableIndices[] = {0, 3, 4};
    int varCount = sizeof(variableIndices)/sizeof(variableIndices[0]);
    
    permuteVariable(arr, variableIndices, varCount);
    
    system("PAUSE");
    return 0;
}
关键修改点
  • 用variableIndices数组圈出需要排列的元素位置,完全避开23和2的索引,递归时只操作这些位置的元素,从根源杜绝固定元素被移动的可能。
  • 去掉了原代码里复杂的交换判断逻辑,因为现在只处理可变元素,不需要再判断是否是固定值,逻辑更清晰,也不会出现重复排列。
  • 打印函数直接输出整个数组,因为固定位置的元素从未被修改,始终保持你需要的状态。

运行这段代码,输出会和你给出的示例完全一致,没有重复。

内容的提问来源于stack exchange,提问作者scott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:15:43