C++ 递归实现火车进出站方案 - 字典序前20种
这道题可以使用递归的方法来求解。首先,我们需要定义一个递归函数来生成出栈方案。
递归函数的参数包括当前火车站中的火车序列,以及当前已经出栈的火车序列。递归函数的终止条件是火车站中没有火车,即当前火车序列为空,此时将已经出栈的火车序列输出。
在递归函数中,我们有两个选择:让右侧头火车进栈或者让栈顶火车出站。如果让右侧头火车进栈,我们将该火车从火车序列中移除,并将其加入到已经出栈的火车序列中。然后,我们继续调用递归函数。如果让栈顶火车出站,我们将栈顶火车从已经出栈的火车序列中移除,并将其加入到当前火车序列中。然后,我们继续调用递归函数。
下面是使用C++编写的代码实现:
#include <iostream>
#include <vector>
using namespace std;
void generateOutStack(vector<int>& nums, vector<int>& outStack, vector<vector<int>>& result) {
// 当火车站中没有火车时,将已经出栈的火车序列加入到结果中
if (nums.empty()) {
result.push_back(outStack);
return;
}
// 让右侧头火车进栈
int num = nums.back();
nums.pop_back();
outStack.push_back(num);
generateOutStack(nums, outStack, result);
outStack.pop_back();
nums.push_back(num);
// 让栈顶火车出站
if (!outStack.empty()) {
int top = outStack.back();
outStack.pop_back();
nums.push_back(top);
generateOutStack(nums, outStack, result);
nums.pop_back();
outStack.push_back(top);
}
}
vector<vector<int>> generateOutStacks(int n) {
vector<int> nums(n);
for (int i = 0; i < n; i++) {
nums[i] = i + 1;
}
vector<int> outStack;
vector<vector<int>> result;
generateOutStack(nums, outStack, result);
return result;
}
int main() {
int n;
cin >> n;
vector<vector<int>> result = generateOutStacks(n);
for (int i = 0; i < min(20, (int)result.size()); i++) {
for (int j = 0; j < n; j++) {
cout << result[i][j];
}
cout << endl;
}
return 0;
}
在主函数中,我们首先读入火车数量n,然后调用generateOutStacks函数生成前20种出栈方案。最后,我们按照题目要求输出前20种答案。
该代码的时间复杂度为O(n!),其中n为火车数量。
原文地址: https://www.cveoy.top/t/topic/qgDJ 著作权归作者所有。请勿转载和采集!