“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @
或者为空格。而倒过来的汉字所用的字符由裁判指定。
输入格式:
输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为 @
或者为空格。
输出格式:
输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出bu yong dao le
,然后再用输入指定的字符将其输出。
输入样例 1:
$ 9
@ @@@@@
@@@ @@@
@ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
@ @ @ @
@ @@@@@
输出样例 1:
$$$$$ $
$ $ $ $
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$
$$$ $$$
$ $ $
$$$ $$$
$$$$$ $
输入样例 2:
& 3
@@@
@
@@@
输出样例 2:
bu yong dao le
&&&
&
&&&
C语言:
思路:
注:scanf()读入后会有个回车需要用getchar()消耗掉
首先设置for循环,利用gets()函数逐行读入
for(i=0;i<N;i++)
{
gets(a[i]);
}
利用双层for循环遍历读入的矩阵元素,对比其首尾是否一致,对比方式如下:
例如输入N=6,则矩阵为6x6,则如下表,用 i,j 表示当i=0;j=0时表示首个元素(0,0),需要与最后一个元素(5,5)进行比对,即(i,j)与(N-1-I , N-1-j)进行比对,以此类推直到比对到中间完成,此时设置标记flag初始值为0,如果对比过程中遇到元素不同的情况则令flag=1跳出循环
(0,0) | (0,1) | (0,2) | (0,3) | (0,4) | (0,5) |
(1,0) | (1,1) | (1,2) | (1,3) | (1,4) | (1,5) |
(2,0) | (2,1) | (2,2) | (2,3) | (2,4) | (2,5) |
(3,0) | (3,1) | (3,2) | (3,3) | (3,4) | (3,5) |
(4,0) | (4,1) | (4,2) | (4,3) | (4,4) | (4,5) |
(5,0) | (5,1) | (5,2) | (5,3) | (5,4) | (5,5) |
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(a[i][j]!=a[N-i-1][N-j-1])
{
flag=1;
break;
}
}
if(flag==1)
{
break;
}
}
遍历读入的矩阵,如果矩阵元素不为空格则将其替换为最初读入的字c
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(a[i][j]!=' ')
{
a[i][j]=c;
}
}
}
综上,标记flag=1则说明需要替换
利用双层循环对置换后的矩阵进行逆向输出
if(flag==1)
{
for(i=N-1;i>=0;i--)
{
for(j=N-1;j>=0;j--)
{
printf("%c",a[i][j]);
}
printf("\n");
}
}
如果flag不等于1,即矩阵对称则输出不用倒了,而后值替换字符原格式输出
else
{
printf("bu yong dao le\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
}
最终形成代码
#include <stdio.h>
int main()
{
int N,i,j,flag=0;
char c;
scanf("%c %d",&c,&N);//读入替换字符c,矩阵规格N
getchar();//消耗的scanf()后产生的回车
char a[101][101];//定义数组用来存储输入的图形
for(i=0;i<N;i++)
{
gets(a[i]);//i代表输入图形的行数,for循环逐行读入
}
for(i=0;i<N;i++)
{//双层循环用来遍历对比输入的内容是否需要倒
for(j=0;j<N;j++)
{
if(a[i][j]!=a[N-i-1][N-j-1])
{//if判断如果存在首尾不同的情况则需要倒此时flag=1,跳出循环
flag=1;
break;
}
}
if(flag==1)
{//利用flag标记跳出外层循环,对比结束
break;
}
}
for(i=0;i<N;i++)
{//遍历读入的矩阵,如果矩阵元素不为空格则将其替换为最初读入的字c
for(j=0;j<N;j++)
{
if(a[i][j]!=' ')
{
a[i][j]=c;
}
}
}
if(flag==1)//综上标记flag=1则说明需要替换
{
for(i=N-1;i>=0;i--)
{//双层循环对置换后的矩阵进行输出
for(j=N-1;j>=0;j--)
{
printf("%c",a[i][j]);
}
printf("\n");
}
}
else
{//如果矩阵对称则输出不用倒了,而后值替换字符原格式输出
printf("bu yong dao le\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
}
return 0;
}