前言:内容包括:题目,代码实现,大致思路,代码解读
题目:
“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 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,若是二维数组中的某个空间存放的是空格,则输出空格