问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
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 }