牛客春招刷题训练营-2025.03.19题解
w 活动地址: 牛客春招刷题训练营 - 编程打卡活动
简单题 简单密码
模拟。
可以打表打出 个字母对应的手机键盘。
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
char jp[26];
int tot = 1;
for (int i = 0; i < 26; i++) {
char c = i + 'a';
if (c == 'a' || c == 'd' || c == 'g' || c == 'j' || c == 'm' || c == 'p' || c == 't' || c == 'w')
tot++;
jp[i] = tot;
}
for (auto c : s) {
if (islower(c)) {
c = jp[c - 'a'] + '0';
} else if (isupper(c)) {
c = tolower(c) + 1;
if (c > 'z')c = 'a';
}
cout << c;
}
return 0;
}
中等题 蛇形矩阵
第一行的数为首项为 ,公差为
的等差数列之和,可以用求和公式直接求出。
第一行之外的数即为其右上角的数减 。
#include <bits/stdc++.h>
using namespace std;
int a[101][101];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++)a[0][i] = (i + 1) * (i + 2) / 2;
for (int i = 1; i < n; i++)
for (int j = 0; j < n - i; j++)
a[i][j] = a[i - 1][j + 1] - 1;
for (int i = 0; i < n; i++)
for (int j = 0; j < n - i; j++)
cout << a[i][j] << " \n"[j == n - i - 1];
return 0;
}
困难题 火车进站
设计递归函数 ,
表示第
辆火车将要入站,
表示当前操作步数。
通过观察可以得知总操作步数一定为 。
对于每一次操作,可以选择以下两种操作:
- 如果火车未全部入站,则将一辆火车入站,然后执行
。
- 如果火车站不为空,则将一辆火车出站,然后执行
。
如果火车全部出站成功,则将出站序列保存。
使用vector存储后直接排序即可。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)cin >> a[i];
vector<int> stk;
vector<int> out;
vector<vector<int>> ans;
auto f = [&](auto&& self, int i, int d)->void {
if (d == 2 * n) {
ans.push_back(out);
return;
}
if (i < n) {
stk.push_back(a[i]);
self(self, i + 1, d + 1);
stk.pop_back();
}
if (!stk.empty()) {
int bk = stk.back();
out.push_back(bk);
stk.pop_back();
self(self, i, d + 1);
stk.push_back(bk);
out.pop_back();
}
};
f(f, 0, 0);
sort(ans.begin(), ans.end());
for (auto& x : ans) {
for (auto& y : x) {
cout << y << ' ';
}
cout << '\n';
}
return 0;
}
#牛客春招刷题训练营#