L1-054 福到了

“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 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;
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值