天梯赛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] 引用某行某列中的单独一个字符串;