L1-054 福到了(分数 15)

本文介绍了一个用于倒置汉字网格的程序设计方法。该程序能够根据用户输入的字符和网格大小,倒置由特定字符组成的N×N网格,并判断是否需要输出'buyongdaole'。适用于希望了解字符网格倒置算法的读者。

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

输入格式:

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

输出格式:

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

输入样例 1:

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

输出样例 1:

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

输入样例 2:

& 3
@@@
 @ 
@@@

输出样例 2:

bu yong dao le
&&&
 & 
&&&

问题分析

用两个字符指针储存对应的字符序列,在输入一个字符后,一个正着保存,一个倒着保存,然后再进行比较,如果相等,输出 bu yong dao le然后在进行除空格之外的字符替换,用替换之后的目标字符进行输出,空格原样输出,不相等对倒着的字符进行上述操作。

代码实现

#include<stdio.h>
int main(){
    char x;//储存要替换为的字符
    int n;//储存网格的规模
    scanf("%c %d",&x,&n);
    getchar();//将回车键读取,否则在读取字符时会出错
    char *z=(char *)malloc(sizeof(char)*n*n);//z用来储存正着的字符表
    char *d=(char *)malloc(sizeof(char)*n*n);//d用来储存倒着的字符表
    for(int i=0;i<n;i++){//模拟行
        for(int j=0;j<n;j++){//模拟列
            char input;//读取一个字符先保存到input中
            scanf("%c",&input);
            z[i*n+j]=input;//正着储存input
            d[(n-1-i)*n+n-1-j]=input;//倒着储存input
        }
        getchar();//每一行后面有一个换行符,将其读取否则会出现错误
    }
    int flag=1;//为1表示相等,为0表示不相等
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(z[i*n+j]!=d[i*n+j]){//对应比较每一个z与d中的字符,如果相等不会进入{}内的语句不会改变flag的值
                flag=0;
                break;
            }
        }
    }
    if(flag){//flag等于1表示倒过来与正着的字符一样
        printf("bu yong dao le\n");
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(z[i*n+j]!=' '){//等于空格原样输出,不等于空格输出替换的字符
                    printf("%c",x);
                }else{
                    printf("%c",z[i*n+j]);
                }
            }
            if(i!=n-1)//打印一行后进行换行操作
                printf("\n");
        }
    }else{
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(d[i*n+j]!=' '){//同上
                    printf("%c",x);
                }else{
                    printf("%c",d[i*n+j]);
                }
            }
            if(i!=n-1)
                printf("\n");
        }
    }
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值