• 基础练习 字母图形


    问题描述

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

    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 }
  • 相关阅读:
    Scanner类
    16 String类
    15_面向对象_01
    14_面向对象_01_2 完整格式
    14_面向对象_01_1 成员变量 成员方法
    13_面向对象辅助看懂实例
    面向对象的基本概念
    Servlet_03 进阶随笔 两种域的运用调用方式
    Servlet_03 资源跳转 关键字
    Servlet_02 资源跳转
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12678085.html
Copyright © 2020-2023  润新知