PTA L1-054 福到了(详解)

文章描述了一个编程问题,要求编写代码将给定的汉字网格倒置输出。输入包括指定的替换字符和汉字网格,输出可能包含buyongdaole提示,表示正反相同。代码示例展示了如何处理这个问题,包括读取输入、判断正反相同和倒置打印的过程。
摘要由CSDN通过智能技术生成

前言:内容包括:题目,代码实现,大致思路,代码解读

题目:

“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格。而倒过来的汉字所用的字符由裁判指定。

输入格式:

输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为 @ 或者为空格。

输出格式:

输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出bu yong dao le,然后再用输入指定的字符将其输出。

输入样例 1:

$ 9
 @  @@@@@
@@@  @@@ 
 @   @ @ 
@@@  @@@ 
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
 @  @ @ @
 @  @@@@@

输出样例 1:

$$$$$  $ 
$ $ $  $ 
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$
 $$$  $$$
 $ $   $ 
 $$$  $$$
$$$$$  $ 

输入样例 2:

& 3
@@@
 @ 
@@@

输出样例 2:

bu yong dao le
&&&
 & 
&&&

代码实现:

#include<stdio.h>
int main()
{
    char ch = 0;
    int n = 0;
    char arr[100][100]={0};
    scanf("%c %d",&ch,&n);
    int flag=1;
    getchar();
    int i = 0;
    //存入汉字
    for(i=0;i<n;i++)
    {
        int j = 0;
        for(j=0;j<n;j++)
        {
            arr[i][j]=getchar();
        }
        getchar();
    }
    //判断正过来和倒过去是否一样
    for(i=0;i<n;i++)
    {
        int j = 0;
        for(j=0;j<n;j++)
        {
            if(arr[i][j]!=arr[n-i-1][n-j-1])
            {
                flag=0;
            }
        }
    }
    
    if(flag==1)
    {
        printf("bu yong dao le\n");
    }
    //倒序打印+逆序打印
    for(i=n-1;i>=0;i--)
    {
        int j = 0;
        for(j=n-1;j>=0;j--)
        {
            if(arr[i][j]==32)
            {
                printf(" ");
            }
            else
            {
                printf("%c",ch);
            }
        }
        printf("\n");
    }
    return 0;
}

大致思路:

 1 要实现汉字倒过来的效果:需要从最后一行开始打印,并逆序这一行,使用循环

 2 判断正过来倒过去是否一样:

    某一行和其对应的行数(某一行的下标+它对应的行数的下标=总行数-1)进行比较,

    某一行的最开始的字符和对应的行数的最后的字符比较,然后依次遍历比较,若是发现有不相同的则说明有必要倒置,若是发现全部都相同,则打印无需倒置的信息:bu yong dao le  比如:

 

 总行数是3 第一行的下标是0 ,其对应的行数是第三行,下标为2     0+2=3-1

  红色方框之间进行比较,橙色方框之间进行比较

代码解读:

part 1

    char ch = 0;
    int n = 0;
    char arr[100][100]={0};
    scanf("%c %d",&ch,&n);
    int flag=1;
    getchar();

使用二维数组arr存储组成汉字的字符

使用flag来标记正过来和倒过去的字符是否相同,若是相同则flag还是初始值1,若是不同则flag置成0

注意:在输入二维数组的行数和列数后(使用的都是同一个数字)需要使用getchar读走数字后的\n

这样在下面使用getchar一个一个读取用户输入的字符后,确保读取的都是有效字符

part 2:存入汉字

    int i = 0;
    for(i=0;i<n;i++)
    {
        int j = 0;
        for(j=0;j<n;j++)
        {
            arr[i][j]=getchar();
        }
        getchar();
    }

使用getchar一个一个字符的读取

注意:在读取完一行的字符后,需要再使用一个getchar读走换行符\n

part 2:判断正过来和倒过去的汉字是否一样

    //判断正过来和倒过去是否一样
    for(i=0;i<n;i++)
    {
        int j = 0;
        for(j=0;j<n;j++)
        {
            if(arr[i][j]!=arr[n-i-1][n-j-1])
            {
                flag=0;
            }
        }
    }
    

比如 

 我们现在要判断整个矩阵正过来和倒过去是否一样,需要行数之间两两比较:

行数0和行数2比较  行数1 和行数1比较

因为0+2=总行数3-1   1+1=总行数3-1

行数之间的两两比较:由于倒过去的汉字是以正着的汉字的最后一行的最后一个字符作为第一行的第一个字符,故而我们需要两行的字符交叉比较

红色方框之间比较,橙色方框之间比较……

part 3:倒序+逆序打印

   if(flag==1)
    {
        printf("bu yong dao le\n");
    }
    //倒序打印+逆序打印
    for(i=n-1;i>=0;i--)
    {
        int j = 0;
        for(j=n-1;j>=0;j--)
        {
            if(arr[i][j]==32)
            {
                printf(" ");
            }
            else
            {
                printf("%c",ch);
            }
        }
        printf("\n");
    }

倒过来的汉字是从正着的汉字的最后一行开始打印,并且需要逆序这一行的字符

空格的ASCII码值是32,若是二维数组中的某个空间存放的是空格,则输出空格

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值