第五周任务 [Cloned] - Virtual Judge (vjudge.net)
【题目描述】
高桥正在开发一款RPG。他决定编写一个代码来检查两个地图是否相等。
我们有网格,水平行和垂直列。网格中的每个单元格都有一个符号或上面写着一个符号。
写在单元格上从顶部开始的第 -行和从左起的第 -列上的符号分别用 和 表示。
以下两个操作称为垂直移位和水平移位。
- 对于每个 ,同时执行以下操作:j=1,2,…,W
- 同时替换A1,j,A2,j,…,AH−1,j,AH,j
- A2,j,A3,j,…,AH,j,A1,j
- 对于每个 ,同时执行以下操作:i=1,2,…,H
- 同时替换为 。Ai,1,Ai,2,…,Ai,W−1,Ai,W
- Ai,2,Ai,3,…,Ai,W,Ai,1
是否有一对满足以下条件的非负整数?如果有,请打印,否则。(s,t)Yes
No
- 应用垂直移位次数和水平移位次数后
这里,据说等于当且仅当对于所有整数对,使得 和 。Ai,j=Bi,(i,j)1≤i≤H 1≤j≤W
【输入】
- 2≤H,W≤30
- Ai,j是
'#'
或‘.
’ ,Bi,j也是 - H并且是整数。W
【输出】
如果有符合的整数对,则打印Yes;否则打印No。
解题思路
这个题可以用暴力解,用到了string中的substr函数。
将两个图分别存入a数组和b数组,将a数组向右补全一个数组作为c数组。
用截取的c数组与b数组比较,其中截取要用到substr函数。
c[5].substr(n,m);//表示从n位置开始截取m个字符(空格也算字符)
c[5].substr(5);//表示从5位置往后截取到最后
c[5].substr(-5);//表示从倒数第五个位置开始截取到最后
如果截取的一行c数组与b数组的一行相等,就按照这个截取的位置,将其余行的c数组截取放在d数组。循环截取完后,用b数组逐行与d数组比较,如果全部相等,就输出Yes,不相等则继续遍历,直至所有循环结束,未找到相等的就输出No。
代码如下
#include<iostream>
using namespace std;
string a[35], b[35], c[35], d[35];
int main() {
int n, m;
cin >> n >> m;
//将输入的图存入a[n],并补一个图放在右边存入c[n]
for (int i = 0; i < n; i++) {
cin >> a[i];
c[i] = a[i] + a[i];
}
//第二个图存入b[n]
for (int i = 0; i < n; i++)
cin >> b[i];
//遍历c[n]数组的行和列
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2 * m; j++) {
//遍历b[n]数组的行
for (int k = 0; k < n; k++) {
//如果截取的一行c数组与b数组的一行相等
//就按照这个截取的位置将其余的c数组截取放在d数组
//注意截取的顺序(从当前位置往后找,再从q=0处往当前位置找)
if (c[i].substr(j, m) == b[k]) {
int ans = 0;
for (int q = i; q < n; q++) {
d[ans] = c[q].substr(j, m);
ans++;
}
for (int q = 0; q < i; q++) {
d[ans] = c[q].substr(j, m);
ans++;
}
int flag = 0;
//接着找截取的d数组是否满足题意
for (int q = 0; q < n; q++) {
if (b[q] != d[q]) {
flag = 1;
}
}
if (flag == 0) {
cout << "Yes" << endl;
return 0;
}
}
}
}
}
cout << "No" << endl;
}