zoukankan      html  css  js  c++  java
  • 基础练习 字母图形

    问题描述

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

    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 }
  • 相关阅读:
    Window 窗口类
    使用 Bolt 实现 GridView 表格控件
    lua的table库
    Windows编程总结之 DLL
    lua 打印 table 拷贝table
    使用 xlue 实现简单 listbox 控件
    使用 xlue 实现 tips
    extern “C”
    COleVariant如何转换为int double string cstring
    原来WIN32 API也有GetOpenFileName函数
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12678085.html
Copyright © 2011-2022 走看看