2024第六次随堂测验参考答案
7-1 宇宙无敌大招呼
据说所有程序员学习的第一个程序都是在屏幕上输出一句“Hello World”,跟这个世界打个招呼。作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼。
输入格式:
输入在第一行给出一个星球的名字S
,是一个由不超过7个英文字母组成的单词,以回车结束。
输出格式:
在一行中输出Hello S
,跟输入的S
星球打个招呼。
输入样例:
Mars
输出样例:
Hello Mars
参考答案:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin >> s;
cout << "Hello " << s;
return 0;
}
7-2 字符串替换
本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:
原字母 | 对应字母 |
---|---|
A | Z |
B | Y |
C | X |
D | W |
… | … |
X | C |
Y | B |
Z | A |
输入格式:
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出替换完成后的字符串。
输入样例:
Only the 11 CAPItaL LeTtERS are replaced.
输出样例:
Lnly the 11 XZKRtaO OeGtVIH are replaced.
参考答案:
#include<bits/stdc++.h>
using namespace std;
map<char, char> mp;
char a[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int main(){
for (int i = 0; i < 26; i++) {
mp[a[i]] = a[25-i];
}
string s;
getline(cin, s);
for (int i = 0; i < s.size(); i++) {
if (s[i] >= 'A' && s[i] <= 'Z') cout << mp[s[i]];
else cout << s[i];
}
return 0;
}
7-3 字符串循环左移
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
Hello World!
2
输出样例:
llo World!He
参考答案:
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
getline(cin, s);
int n;
cin >> n;
n = n%s.size();
string ans;
ans = s.substr(n) + s.substr(0,n);
cout << ans;
return 0;
}
7-4 大炮打蚊子
现在,我们用大炮来打蚊子:蚊子分布在一个M×N格的二维平面上,每只蚊子占据一格。向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意:
O
OXO
O
其中,X
为炮弹落点中心,O
为紧靠中心的四个有杀伤力的格子范围。若蚊子被炮弹命中(位于X
格),一击毙命,若仅被杀伤(位于O
格),则损失一半的生命力。也就是说,一次命中或者两次杀伤均可消灭蚊子。现在给出蚊子的分布情况以及连续k
发炮弹的落点,给出每炮消灭的蚊子数。
输入格式:
第一行为两个不超过20的正整数M
和N
,中间空一格,表示二维平面有M
行、N
列。
接下来M
行,每行有N
个0
或者#
字符,其中#
表示所在格子有蚊子。
接下来一行,包含一个不超过400的正整数k
,表示发射炮弹的数量。
最后k
行,每行包括一发炮弹的整数坐标x
和y
(0≤x
<M
,0≤y
<N
),之间用一个空格间隔。
输出格式:
对应输入的k
发炮弹,输出共有k
行,第i
行即第i
发炮弹消灭的蚊子数。
输入样例:
5 6
00#00#
000###
00#000
000000
00#000
2
1 2
1 4
输出样例:
0
2
参考答案:
#include <bits/stdc++.h>
using namespace std;
int main(){
int m,n;
cin >> m >> n;
int a[25][25] = {0};
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
char c;
cin >> c;
if (c == '#') a[i][j] = 2;
}
}
int k;
cin >> k;
while(k--) {
int x, y;
cin >> x >> y;
x++;
y++;
int ans = 0;
if (a[x][y] == 2 || a[x][y] == 1) {
ans++;
a[x][y] = 0;
}
if (a[x-1][y] == 2 || a[x-1][y] == 1) {
a[x-1][y]--;
if (a[x-1][y] == 0) ans++;
}
if (a[x+1][y] == 2 || a[x+1][y] == 1) {
a[x+1][y]--;
if (a[x+1][y] == 0) ans++;
}
if (a[x][y-1] == 2 || a[x][y-1] == 1) {
a[x][y-1]--;
if (a[x][y-1] == 0) ans++;
}
if (a[x][y+1] == 2 || a[x][y+1] == 1) {
a[x][y+1]--;
if (a[x][y+1] == 0) ans++;
}
cout << ans << endl;
}
return 0;
}
7-5 机工士姆斯塔迪奥
在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。
你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。
给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。
输入格式:
输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。
接下来 Q 行,每行两个数 Ti,Ci,其中 Ti=0 表示 BOSS 选择的是一整行,Ti=1 表示选择的是一整列,Ci 为选择的行号/列号。行和列的编号均从 1 开始。
输出格式:
输出一个数,表示安全格子的数量。
输入样例:
5 5 3
0 2
0 4
1 3
输出样例:
12
参考答案:
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n,q,t,c;
int cnt=0;
cin >> m >> n >> q;
int a[m+1][n+1];
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
a[i][j] = 1;
}
}
int sum = m*n;
for(int i = 1; i <= q; i++){
cin >> t >> c;
if(t == 0){
for(int j = 1; j <= n; j++){
if(a[c][j] == 1){
cnt++;
a[c][j]=0;
}
}
}
if(t == 1){
for(int j = 1; j <= m; j++){
if(a[j][c] == 1){
cnt++;
a[j][c] = 0;
}
}
}
}
cout << (sum-cnt);
}