基础练习 字母图形

问题描述

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。
思路:最初自己写的思路乱七八糟的,大体是先打印第一行,然后剩下的先倒序后逆序导入数组,导致最后几乎成了面向答案编程,写了60行代码,花了很长时间,然后去网上搜了一下,看到一个思路,就是当 i == j 的时候'A',所以我就想假定图形足够大我们就可以把每一行的'A',作为分界线,或者说整个图形的'A'作为对角线,对角线左边是逆序的,对角线右边是正序的,有的当 n > m 时图形可能没有A,不过没有关系,我们的循环的限制,所以动脑找规律真的很重要,下面第一段是自己最初写的,后边一段是优化的。
 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int n, m;
 6     int i, j;
 7     int flag = 0;
 8     int flag2 = 0;
 9     char s[27][27] = { 0 };
10     //printf("ABCDEFG
");
11     scanf("%d %d", &n, &m);
12     if (n >= m)
13     {
14         flag = 1;
15     }
16     for (i = 0; i < n; i++)
17     {
18         int cnt = i;
19         for (j = 0; j < m; j++)
20         {
21             if (i == 0)
22             {
23                 s[i][j] = j + 65;
24             }
25             else
26             {
27                 s[i][0] = s[i - 1][0] + 1;
28                 while (cnt)
29                 {
30                     if (j >= m - 1)
31                     {
32                         flag2 = 2;
33                         break;
34                     }
35                     s[i][++j] = s[i][j - 1] - 1;
36                     cnt--;
37                 }
38                 if ((flag == 1 && j == m - 1) || flag2 == 2)
39                 {
40                     break;
41                 }
42                 else
43                 {
44                     s[i][++j] = s[i][j - 1] + 1;
45                 }
46                 if (j == m-1)
47                     break;
48                 else
49                     j--;
50             }
51         }
52         flag2 = 0;
53     }
54 
55     for (i = 0; i < n; i++)
56     {
57         printf("%s
", s[i]);
58     }
59     return 0;
60 }

优化后:

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int n, m;
 6     int i, j, k;
 7     char s[27][27] = {0};
 8 
 9     scanf("%d %d", &n, &m);
10     //int cnt = m;
11     for (i = 0; i < n; i++)
12     {
13         s[i][0] = 'A' + i;
14         
15         for (j = 1; j <= i; j++) //对角线左边
16         {
17             if (j >= m) //防止n>m时会出现越界的情况
18                 break;
19             s[i][j] = s[i][j - 1] - 1;
20             if (j == i)
21             {
22                 s[i][j] = 'A';
23             }
24         }
25 
26         for (k = i + 1; k < m; k++) //对角线右边
27         {
28             s[i][k] = s[i][k - 1] + 1;
29         }
30     }
31 
32     for (i = 0; i < n; i++)
33     {
34         printf("%s
", s[i]);
35     }
36     return 0;
37 }
原文地址:https://www.cnblogs.com/ZhengLijie/p/12678085.html