一、题目
“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格。而倒过来的汉字所用的字符由裁判指定。
输入格式:
输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为 @ 或者为空格。
输出格式:
输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出bu yong dao le,然后再用输入指定的字符将其输出。
输入样例 1:
输出样例 1:
输入样例 2:
输出样例 2:
二、方法1
1、思路
易错点提示:
- 关于输入:
(1)在输入时,先输入字符 c 和网格的规模 N,然后记得用 getchar() 来吸收回车,然后用 gets接收输入的图形;
(2) 也可以用循环来依次输入每一个字符,这样需要每个外层循环都使用一次 getchar(),在内层循环使用 getchar() 来接收;
(3)切记不能使用 scanf ,因为它不能接收空格! - 关于检验是否倒了:
(1)将图形存放在二维数组里,由于这个数组是 N 行 N 列,它的第一位 str[0][0] 与最后一位 str[N - 1][N - 1] 对应,依次类推,我们就可以得到 str[i][j] 与 str[N - i - 1][N - j - 1] 对应;
(2)可以用一个变量 flag 来判断图形是否倒了,如果有一组对应字符不相同,则整个图形就不对称,可以直接跳出循环。 - 关于替换:
遍历图形,判断是否为空格,若不是空格说明需要替换,将其替换为指定字符即可。 - 关于输出:
(1)若图形不对称,则从最后一位开始遍历输出;
(2)若图形对称,则从第1位开始遍历输出。(其实对称从哪里开始都可以,只是博主有强迫症)
2、代码
#include<stdio.h>
int main()
{
int N, i, j, flag = 0;
char c;
scanf("%c %d", &c, &N);
getchar();
char str[105][105];
for (i = 0; i < N; i++)
{
gets(str[i]);
}
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
if (str[i][j] != str[N - i - 1][N - j - 1])
{
flag = 1;
break;
}
}
if (flag)
break;
}
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
if (str[i][j] != ' ')
str[i][j] = c;
}
}
if (flag)
{
for (i = N-1; i >=0; i--)
{
for (j = N-1; j >=0; j--)
{
printf("%c", str[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", str[i][j]);
}
printf("\n");
}
}
return 0;
}