现在给你一张白纸(我们可以理解为空格字符),白纸上面画着一个由非空格字符组成的图形。NPC希望你能帮他判断,这个图形是否是一个对称图形。
如果该图形是一个沿平行于Y轴对称的图形,那么NPC会获得+1的好感度;
如果该图形是一个沿平行于X轴对称的图形,那么NPC会获得+2的好感度;
如果该图形是一个中心对称的图形,那么NPC会获得+3的好感度。
NPC的好感度初始为0,且好感度可以叠加,现在给出你一个图形,你需要判断,这个图形能够给NPC带来多少的好感度。
(注意,空格可以近似理解为白纸,不属于图形,在考虑对称的时候要予以忽视)
输入
一个整数n,表示后续输入有n行,n<=100
接下来n行字符串,表示白纸上的状态,如果为空格字符,则说明白纸上此处无字,如果为非空格字符,说明此处有一个图案。
注意,某一行可能是全部由空格组成的字符串。
每行字符串长度小于100。
输出
一个整数,表示该图形得分
样例输入
样例输入1:
4
样例输入2:
2
样例输入3:
2
A*
A*
样例输出
样例输出1:
6
样例输出2:
1
样例输出3:
2
提示
样例1中:
输入第一行为空格字符串,表示空白区域,读入后应予以忽视。
第二到四行组成的图形,显然既沿 平行于Y轴的线对称、又沿 平行于X轴的线对称,同时也是中心对称,故得分为1+2+3=6分。
样例2中:
输入包含两行,均为有意义的字符串,其中每行的第二个字符均为空格。
显然仅通过观察,内部的空白字符不影响图案的对称性,即可判断,该图形沿 平行于Y轴的线对称,故得分为1分。
样例3中:
输入包含两行,均为有意义的字符串,其中每行字符串的前3个字符均为空格。
显然,开头的空白字符其含义是白纸的空白区域,并非我们判断的图形区域,予以忽略。
对应的图形区域,为沿 平行于X轴的线对称图形,故得分为2分。
已经帮你完成C++示例代码如下:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 定义一个表示图形的二维数组
vector<vector<char>> shape;
// 定义一个变量来表示NPC的好感度
int score = 0;
// 定义一个函数,用来判断图形是否沿平行于Y轴对称
bool is_y_symmetry() {
// 获取图形的高度
int height = shape.size();
// 获取图形的宽度
int width = shape[0].size();
// 遍历图形的每一行
for (int i = 0; i < height; i++) {
// 遍历图形的每一列
for (int j = 0; j < width / 2; j++) {
// 如果当前位置的字符和对称位置的字符不相等,就返回false
if (shape[i][j] != shape[i][width - j - 1]) {
return false;
}
}
}
// 如果没有返回false,就返回true
return true;
}
// 定义一个函数,用来判断图形是否沿平行于X轴对称
bool is_x_symmetry() {
// 获取图形的高度
int height = shape.size();
// 获取图形的宽度
int width = shape[0].size();
// 遍历图形的每一行
for (int i = 0; i < height / 2; i++) {
// 遍历图形的每一列
for (int j = 0; j < width; j++) {
// 如果当前位置的字符和对称位置的字符不相等,就返回false
if (shape[i][j] != shape[height - i - 1][j]) {
return false;
}
}
// 定义一个函数,用来判断图形是否是中心对称的
bool is_center_symmetry() {
// 获取图形的高度
int height = shape.size();
// 获取图形的宽度
int width = shape[0].size();
// 遍历图形的每一行
for (int i = 0; i < height / 2; i++) {
// 遍历图形的每一列
for (int j = 0; j < width / 2; j++) {
// 如果当前位置的字符和对称位置的字符不相等,就返回false
if (shape[i][j] != shape[height - i - 1][width - j - 1]) {
return false;
}
}
}
// 如果没有返回false,就返回true
return true;
}
int main() {
// 读入图形的高度
int n;
cin >> n;
// 读入每一行的字符串,并存储到二维数组中
for (int i = 0; i < n; i++) {
string line;
cin >> line;
shape.push_back(vector<char>(line.begin(), line.end()));
}
// 如果图形沿平行于Y轴对称,就加1分
if (is_y_symmetry()) {
score++;
}
// 如果图形沿平行于X轴对称,就加2分
if (is_x_symmetry()) {
score += 2;
}
// 如果图形是中心对称的,就加3分
if (is_center_symmetry()) {
score += 3;
}
// 输出最终的分数
cout << score << endl;
return 0;
}
高手