如何在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
相关产品推荐
相关产品推荐

