问题描述 :
一块N x N(1=<N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。
写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
#1:转90度:图案按顺时针转90度。
#2:转180度:图案按顺时针转180度。
#3:转270度:图案按顺时针转270度。
#4:反射:图案在水平方向翻转(形成原图案的镜像)。
#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。
#6:不改变:原图案不改变。
#7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
比如:
转换前:
@-@
---
@@-
转换后:
@-@
@--
--@
这种转换采取#1(按顺时针转90度)即可。
注意:图案中的字符“@”和“-”在转90度后,还是“@”和“-”。不要认为“-”转90度后变成“|”。
输入说明 :
第一行: 单独的一个整数N。
第二行到第N+1行: N行,每行N个字符(不是’@‘就是’-');这是转换前的正方形。
第N+2行到第2*N+1行: N行,每行N个字符(不是’@‘就是’-');这是转换后的正方形。
输出说明 :
单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。
输入范例 :
3
--@
--@
---
@@-
---
---
输出范例 :
3
完整C++代码
很枯燥,实在不想写这道
#include <bits/stdc++.h>
using namespace std;
int n;
vector<vector<char> > b(10, vector<char>(10));
// 顺时针转90
vector<vector<char> > fun90(vector<vector<char> > before) {
vector<vector<char> > after(n, vector<char>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
after[j][n - i - 1] = before[i][j];
}
}
return after;
}
// 顺时针转180
vector<vector<char> > fun180(vector<vector<char> > before) {
vector<vector<char> > after1 = fun90(before);
vector<vector<char> > after2 = fun90(after1);
return after2;
}
// 顺时针转270
vector<vector<char> > fun270(vector<vector<char> > before) {
vector<vector<char> > after1 = fun90(before);
vector<vector<char> > after2 = fun90(after1);
vector<vector<char> > after3 = fun90(after2);
return after3;
}
// 水平翻转
vector<vector<char> > level(vector<vector<char> > before) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
swap(before[i][j], before[i][n - j - 1]);
}
}
return before;
}
int check(vector<vector<char> > c) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (c[i][j] != b[i][j]) return 0;
}
}
return 1;
}
int main()
{
cin >> n;
vector<vector<char> > a(n, vector<char>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> b[i][j];
}
}
vector<vector<char> > level_ = level(a);
if (check(fun90(a))) {
cout << 1 << endl;
} else if (check(fun180(a))) {
cout << 2 << endl;
} else if (check(fun270(a))) {
cout << 3 << endl;
} else if (check(level_)) {
cout << 4 << endl;
} else {
if (check(fun90(level_)) || check(fun180(level_)) || check(fun270(level_))) {
cout << 5 << endl;
} else if (check(a)) {
cout << 6 << endl;
} else {
cout << 7 << endl;
}
}
return 0;
}
😋欢迎大伙私信或者评论区交流讨论😋