第十四届蓝桥杯青少组C++选拔赛[2022.11.27]第二部分编程题(4、找路线)
参考程序:
#include <bits/stdc++.h>
using namespace std;int main() {int N, M;cin >> N >> M;int d = M - N; // 需要走的“阶数”if (d <= 0) { // 题目保证 N < M,但我们多做个稳妥判断cout << 0 << "\n";return 0;}// dp[i] 表示差 i 阶时的走法数// dp[0] = 1, dp[1] = 1, dp[i] = dp[i-1] + dp[i-2]vector<long long> dp(d + 1, 0);dp[0] = 1;if (d >= 1) dp[1] = 1;for (int i = 2; i <= d; ++i) dp[i] = dp[i-1] + dp[i-2];cout << dp[d] << "\n";return 0;
}
拓展程序:
#include <bits/stdc++.h>
using namespace std;int N, M;
vector<int> path; // 保存当前路线
vector<vector<int>> allRoutes; // 保存所有路线// 递归函数,从当前节点cur走到M
void dfs(int cur) {if (cur == M) { allRoutes.push_back(path); // 找到一条完整路线return;}if (cur > M) return; // 超过目标,结束// 走一步path.push_back(cur + 1);dfs(cur + 1);path.pop_back();// 走两步path.push_back(cur + 2);dfs(cur + 2);path.pop_back();
}int main() {cin >> N >> M;path.push_back(N); // 从N开始dfs(N);// 输出所有路线cout << "总共有 " << allRoutes.size() << " 条路线:" << endl;for (auto &route : allRoutes) {for (int i = 0; i < route.size(); i++) {cout << route[i];if (i != route.size() - 1) cout << " -> ";}cout << endl;}return 0;
}