C++实现对称图形小程序

现在给你一张白纸(我们可以理解为空格字符),白纸上面画着一个由非空格字符组成的图形。NPC希望你能帮他判断,这个图形是否是一个对称图形。
如果该图形是一个沿平行于Y轴对称的图形,那么NPC会获得+1的好感度;

如果该图形是一个沿平行于X轴对称的图形,那么NPC会获得+2的好感度;

如果该图形是一个中心对称的图形,那么NPC会获得+3的好感度。

NPC的好感度初始为0,且好感度可以叠加,现在给出你一个图形,你需要判断,这个图形能够给NPC带来多少的好感度。

    (注意,空格可以近似理解为白纸,不属于图形,在考虑对称的时候要予以忽视)

输入
一个整数n,表示后续输入有n行,n<=100

接下来n行字符串,表示白纸上的状态,如果为空格字符,则说明白纸上此处无字,如果为非空格字符,说明此处有一个图案。

注意,某一行可能是全部由空格组成的字符串。

每行字符串长度小于100。

输出
一个整数,表示该图形得分
样例输入
样例输入1:
4




样例输入2:
2

  • *
    A A

样例输入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;
}

高手