有趣的对称图形问题C++/C

小明喜欢对称图形,他觉得对称图形非常优美。
现在给你一张白纸(可以理解为空格字符),白纸上面画着一个由非空格字符组成的图形。小明希望你能帮他判断,这个图形是否是一个对称图形。
如果该图形是一个沿平行于Y轴对称的图形,那么小明会获得+1的好感度;
如果该图形是一个沿平行于X轴对称的图形,那么小明会获得+2的好感度;
如果该图形是一个中心对称的图形,那么小明会获得+3的好感度。
小明的好感度初始为0,且好感度可以叠加,现在给出你一个图形,你需要判断,这个图形能够给他带来多少的好感度。
(注意,空格可以近似理解为白纸,不属于图形,在考虑对称的时候要予以忽视)

输入

一个整数n,表示后续输入有n行,n<=100
接下来n行字符串,表示白纸上的状态,如果为空格字符,则说明白纸上此处无字,如果为非空格字符,说明此处有一个图案。
注意,某一行可能是全部由空格组成的字符串。
每行字符串长度小于100。

这里是输入输出案例图片

img

输出

一个整数,表示该图形得分

提示

样例1中:

输入第一行为空格字符串,表示空白区域,读入后应予以忽视。
第二到四行组成的图形,显然既沿 平行于Y轴的线对称、又沿 平行于X轴的线对称,同时也是中心对称,故得分为1+2+3=6分。

样例2中:

输入包含两行,均为有意义的字符串,其中每行的第二个字符均为空格。
显然仅通过观察,内部的空白字符不影响图案的对称性,即可判断,该图形沿 平行于Y轴的线对称,故得分为1分。

样例3中:

输入包含两行,均为有意义的字符串,其中每行字符串的前3个字符均为空格。
显然,开头的空白字符其含义是白纸的空白区域,并非我们判断的图形区域,予以忽略。
对应的图形区域,为沿 平行于X轴的线对称图形,故得分为2分。

如何用c语言实现对称图形
如有帮助,望采纳

#include <stdio.h>
#include <stdlib.h>


int main()
{
    for (int i = 0; i < 7; i++)
    {
        for (int j = 0; j< 2*i+1; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    
    for (int i = 0; i <= 6; i++)
    {
        for (int j = 0; j < 11-2*i; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    system("pause");
    return 0;

}


https://blog.csdn.net/qmqm33/article/details/93351390

写个思路:
1、检查有效行数;也就是过滤开头的空格;如果是空格就跳过;得到有效行数和每行有效数据;
2、检查每行的长度是否对称;如果不对称,那就不是对 称图形;如果长度对称,还存在不一样的长度,那只可能是X对称;
3、分别进行X对称和Y对称检查;
4、对称性检查:
X对称性,从上下两头比较;Y对称,从左右两头比较;如果都通过了,就是中心对称;

楼上理解错了吧?题目是要求计算好感度的数值,不是要输出图形,图形是需要输入的,在根据输入的行数,输入图形来计算好感度,是吧,MM酱 ?

这个题目,如果第一行和最后一行是空白行,需要忽略掉,中间的空白行不能忽略。
n是去掉首行和尾行空白行后的行数:
行对称:i 和n-1-i行比较,遍历行,如果行中的所有元素都一致,那么就是行对称
列堆成:i和n-1-i列比较,遍历列,如果列中的元素都一致,那么就是列堆成
中心对称:既是行对称也是列对称

代码如下,测试正确

#include<iostream>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<cstring>
using namespace std;

void calc_valid_graph(char grap[101][100], int n, int &row_valid, int &colum_valid, char grap_strim_blank[101][100])
{
    int row_start = 0, colum_start = 0;
    int i,j, m, ii, jj;
    m = n;
    row_valid = n;
    for(i = 0; i < m; i++) {
        for(j = 0; j < 100; j++) {
            if(grap[i][j] != ' ' || grap[i][j] == '\0') break;
        }
        if(grap[i][j] == '\0' || j == 100) {row_start++; row_valid--;}
        else break;
    }

    m = n;
    for(i = m-1; i >=0; i--) {
        for(j = 0; j < 100; j++) {
            if(grap[i][j] != ' ' || grap[i][j] == '\0') break;
        }
        if(grap[i][j] == '\0' || j == 100) {row_valid--;}
        else break;
    }
    m = colum_valid;
    for(j = 0; j < m ; j--) {
        for(i = 0; i < n; i++) {
            if(grap[i][j] != ' ' || grap[i][j] == '\0') break;
        }
        if(i == n) {colum_start++; colum_valid--;}
        else break;
    }

    for(i = row_start, ii=0 ; ii < row_valid; i++, ii++) {
        for(j = colum_start, jj=0; jj < colum_valid; j++, jj++)
            grap_strim_blank[ii][jj] = grap[i][j];
        grap_strim_blank[ii][jj] = '\0';
    }
}

int is_x_symmc(char grap[101][100], int row_valid, int colum_valid)
{
    int cout = row_valid/2;
    int i, j;
    for(i = 0; i < cout; i++) {
        for(j = 0; j < colum_valid; j++) {
            if(grap[i][j] != grap[row_valid - i -1][j]) return 0;
        }
    }
    return 1;
}

int is_y_symmc(char grap[101][100], int row_valid, int colum_valid)
{
    int cout = colum_valid/2;
    int i, j;
    for(j = 0; j < cout; j++) {
        for(i = 0; i < row_valid; i++) {
            if(grap[i][j] != grap[i][colum_valid - j -1]) return 0;
        }
    }
    return 1;
}

int is_corepoint_symmc(char grap[101][100], int row_valid, int colum_valid)
{
    int cout = row_valid/2+1;
    int i, j;
    for(i = 0; i < cout; i++) {
        for(j = 0; j < colum_valid; j++) {
            if(grap[i][j] != grap[row_valid-i-1][colum_valid-j-1]) return 0;
        }
    }
    return 1;
}

int main()
{
    int n,i,len;
    char graph[101][100] = {'\0'};
    char graph_strim_blank[101][100] = {'\0'};/*存储去除空格的字符,也可以不去除,下标会复杂很多*/
    int row_valid, colum_valid;
    int flag, score=0;

    cin >> n;
    cin.get();
    colum_valid = 0;
    for(i = 0; i<n; i++) {
        cin.getline(graph[i], 100, '\n');
        len = strlen(graph[i]); if(colum_valid < len) colum_valid = len;
    }

    row_valid = 0;/*去除无效空格的字符,包括3个方向的空格,上,下,左*/
    calc_valid_graph(graph, n, row_valid, colum_valid, graph_strim_blank);

    /*判断是否为x对称*/
    flag = is_y_symmc(graph_strim_blank, row_valid, colum_valid);
    if(flag) score+=1;
    flag = is_x_symmc(graph_strim_blank, row_valid, colum_valid);
    if(flag) score+=2;
    /*判断是否为中心对称,中心对称和xy对称不是充要条件条件,需要单独判断*/
    flag = is_corepoint_symmc(graph_strim_blank, row_valid, colum_valid);
    if(flag) score+=3;

    cout << score << endl;
    return 0;
}