题目要求: 李雷和韩梅梅坐前后排。上课想说话怕老师发现,所以改为传小纸条。为了被老师发现他们纸条上说的是啥,他们约定了如下方法传递信息: 将26个英文字母(全为大写),外加空格,一共27个字符分成三组,每组9个。也就是ABCDEFGHI是第一组,JKLMNOPQR是第二组,STUVWXYZ是第三组(此处用代表空格)。 然后根据传递纸条那天的日期,改变字母的位置 先根据月份数m, 以整个分组为单位进行循环左移,移动(m-1)次。然后根据日期数d,对每个分组内的字符进行循环左移,移动(d-1)次。 例如:以3月8号为例,首先移动分组,3月需要循环左移2次,变成:STUVWXYZ*,ABCDEFGHI,JKLMNOPQR 然后对每组内的字符,8日需要循环左移7次,最终编程: Z*STUVWXY,HIABCDEFG,QRJKLMNOP 对于需要传递信息中的每个字符。用组号和组内序号两个数字来表示。 如果在3月8号需要传递信息为“HAPPY”,那么H位于第2组第1个,A位于第2组第3个…依次类推。所以最终纸条上写成: 21 23 39 39 19 现给定日期和需要传递的信息,请输出应该写在纸条上的编码。 输入 每个输入包含两行。 第一行是用空格分隔的两个数字,分别代表月份和日子。输入保证是一个合法的日期 第二行为需要编码的信息字符串,仅由大写字母A~Z和空格组成,字符串长度不超过1024个字符。 输出 对每个输入,打印对应的编码,数字之间用空格分隔,每个输出占一行。 样例输入 Copy 3 8 HAPPY 样例输出 Copy 21 23 39 39 19
解题思路: 分别完成数组的平移和数组内字符串的平移后,遍历输入的字符串,在数组内寻找并判断(此时相当于一个二维数组),若数组内的字符等于输入的字符串内的字符,输出此时数组内字符的坐标。
需要注意: 在进行向左平移时,需要先对平移的步数用数组长度进行取余,否则会造成数组越界。
通关代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template<typename T>
T moveArr(T arr, int n) {
int LEN = arr.size();
n = n % LEN;
reverse(arr.begin(), arr.begin() + n);
reverse(arr.begin() + n, arr.end());
reverse(arr.begin(), arr.end());
return arr;
}
int main() {
vector<string> arr = {"ABCDEFGHI", "JKLMNOPQR", "STUVWXYZ "};
int month, day;
string str;
cin >> month >> day;
arr = moveArr<vector<string>>(arr, month - 1);
for (int i = 0; i < 3; i++) {
arr[i] = moveArr<string>(arr[i], day - 1);
}
cin.ignore();
getline(cin, str);
int LEN = str.size();
for (int i = 0; i < LEN; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 9; k++) {
if (arr[j][k] == str[i]) {
cout << j + 1 << k + 1 << ' ';
}
}
}
}
return 0;
}
通关截图: