天梯赛L1-054 福到了

一、问题描述

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

输入格式:

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

输出格式:

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

输入样例 1:

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

输出样例 1:

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

输入样例 2:

& 3
@@@
 @ 
@@@
 

输出样例 2:

bu yong dao le
&&&
 & 
&&&
 
 

二、设计思路

(1)先用字符串数组接收n个字符串,以及需要将原来字符换成的新字符ch;

(2)初始化一个bool类型变量x为true,然后用for循环,依次对比第一个元素和最后一个元素,第二个元素和倒数第二个元素......如果有任何一对元素不相同,则将false赋值给x;

(3)根据x的数值,来对应进行输出,如果x为true,则表明该图案倒转前后一样,先输出“bu yong dao le”,再按照原图案输出即可,如果x为false,则倒着输出该图案,即从最后一行的最后一个元素依次输出;

三、程序流程图

 

四、伪代码

五、代码

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 int main()
 5 {
 6     string s[100];   //看成一个二维字符数组
 7     int n;
 8     char ch;
 9     cin >> ch >> n;
10     getchar();
11     for (int i = 0; i < n; i++)
12     {
13         getline(cin, s[i]);
14     }
15     bool x = true;
16     for (int i = 0; i < n; i++)
17     {
18         for (int j = 0; j < n; j++)
19         {
20             int a = n - i - 1;   //i,j是从0开始的,对应的元素都要相应-1(即n-i之后再-1)
21             int b = n - j - 1; //s[a][b]是与s[i][j]所对应的元素
22             if (s[i][j] != s[a][b])
23             {
24                 x = false;     //只要有任何一对元素不相同,则需要倒转,就把x的值置为false
25             }
26         }
27     }
28     if (x)      //不同x的值对应不同的输出情况
29     {
30         cout << "bu yong dao le" << endl;
31         for (int i = 0; i < n; i++)
32         {
33             for (int j = 0; j < n; j++)
34             {
35                 if (s[i][j] == ' ')
36                 {
37                     cout << " ";
38                 }
39                 else
40                 {
41                     cout << ch;
42                 }
43             }
44             cout << endl;
45         }
46     }
47     else
48     {
49         for (int i = 0; i < n; i++)
50         {
51             for (int j = 0; j < n; j++)
52             {
53                 int a = n - i - 1;
54                 int b = n - j - 1;
55                 if (s[a][b] == ' ')
56                 {
57                     cout << " ";
58                 }
59                 else
60                 {
61                     cout << ch;
62                 }
63             }
64             cout << endl;
65         }
66     }
67     return 0;
68 }

运行结果:

 

 

六、总结

(1)二维字符数组可以用string s【n】定义一个n*n的字符数组;

(2)由于在二维字符数组每个字符串单独占一行, 所以可以用 s[n] 引用该二维数组字符中第 n 行的字符串, 也可以用 s[i][j] 引用某行某列中的单独一个字符串;

posted @ 2023-05-18 19:41  连师傅只会helloword  阅读(20)  评论(0编辑  收藏  举报