c - C 中的星形图案

标签 c algorithm

我正在尝试解决这个问题,用户的输入是星星的最大长度.. 例如

enter image description here
该图像用于输入 11 和 12
enter image description here

其他模式示例

(9) 1-5-9-5-9-5-1
(11) 1-5-9-11-9-11-9-5-1
(12) 2-6-10-12-10-12-10-6-2
(16) 2-6-10-14-16-14-10-14-16-14-10-6-2

如果数字是奇数,星星从一颗开始,每行增加四颗,但是当增量大于最大长度时,只增加两颗。如果数字是偶数,星星从两颗开始,但是遵循相同的递增方式。

所以,我尝试做的是先处理第一个上半部分,然后再镜像它,这里是我的代码,仅适用于奇数,计划在此之后处理偶数

#include <stdio.h>

int main(){
    int stars, spaces, maxlen, rows;
    int spac=0, star=1;
    scanf("%d", &maxlen);

    for (rows=1;rows<=maxlen;rows++){
        for(spaces=1; spaces<=(maxlen/2)-spac; spaces++){
            printf(" ");
        }

        for(stars=1; stars<=star; stars++){
            printf("*");
        }

        printf("\n");

        if (star>=maxlen)
            break;

        if (star==9)
            star += 2;
        else
            star += 4;

        spac+=2;
    }

    return 0;
}

代码适用于 1、9、11,但是当我从 13+ 输入时出现问题,它没有给我预期的结果...

任何帮助我如何解决这个问题,我将感谢对我的方法的评论,这是一个好的方法还是我应该学习另一种解决模式的方法,以更轻松地解决这种不规则模式?

最佳答案

正如我看到的图案,有两个重叠的*符号正方形,边缘经过修剪,超出了线的长度(最长的线只比前一行多两个*) 第二件事是不确定这两个方 block 有多远。

我是这样写的:

#include <stdio.h>

#define OVERLAPP 1

int linesCount(int maxlen)
{
    return maxlen + maxlen%2 + (OVERLAPP);
}

int get_stars(int maxlen, int line)
{
    if (2 * line > linesCount(maxlen))
    {
       return get_stars(maxlen, linesCount(maxlen) - line - 1);
    }
    else
    {
        int stars;
        stars = 2 - maxlen%2;
        stars += 4 * line;
        if (stars > maxlen)
        {
            if (stars - maxlen < 3)
            {
                stars = maxlen;
            }
            else
            {
                stars = 2 * maxlen - stars + 4;
            }
        }
        return stars;
    }
}

int main(int argc, char **argv)
{
    int maxlen;
    int maxlines;
    int line;
    int column;
    int current_stars;

    scanf("%d", &maxlen);
    maxlines = linesCount(maxlen);

    for(line = 0; line < maxlines; line++)
    {
        current_stars = get_stars(maxlen, line);
        for(column = 0; 2 * column + 1 < maxlen - current_stars; column++)
        {
            printf(" ");
        }
        for(column = 0; column < current_stars; column++)
        {
            printf("*");
        }
        for(column = 0; 2 * column + 1 < maxlen - current_stars; column++)
        {
            printf(" ");
        }
        printf(" %d\n", current_stars);
    }

}

结果如下:

gcc golf.c; seq 20 | xargs -I num echo "echo;echo "--------num---------";echo; echo num | ./a.exe" | bash

--------1---------

* 1
* 1
* 1

--------2---------

** 2
** 2
** 2

--------3---------

 *  1
*** 3
 *  1
*** 3
 *  1

--------4---------

 **  2
**** 4
 **  2
**** 4
 **  2

--------5---------

  *   1
***** 5
***** 5
  *   1
***** 5
***** 5
  *   1

--------6---------

  **   2
****** 6
****** 6
  **   2
****** 6
****** 6
  **   2

--------7---------

   *    1
 *****  5
******* 7
 *****  5
   *    1
 *****  5
******* 7
 *****  5
   *    1

--------8---------

   **    2
 ******  6
******** 8
 ******  6
   **    2
 ******  6
******** 8
 ******  6
   **    2

--------9---------

    *     1
  *****   5
********* 9
********* 9
  *****   5
    *     1
  *****   5
********* 9
********* 9
  *****   5
    *     1

--------10---------

    **     2
  ******   6
********** 10
********** 10
  ******   6
    **     2
  ******   6
********** 10
********** 10
  ******   6
    **     2

--------11---------

     *      1
   *****    5
 *********  9
*********** 11
 *********  9
   *****    5
     *      1
   *****    5
 *********  9
*********** 11
 *********  9
   *****    5
     *      1

--------12---------

     **      2
   ******    6
 **********  10
************ 12
 **********  10
   ******    6
     **      2
   ******    6
 **********  10
************ 12
 **********  10
   ******    6
     **      2

--------13---------

      *       1
    *****     5
  *********   9
************* 13
************* 13
  *********   9
    *****     5
      *       1
    *****     5
  *********   9
************* 13
************* 13
  *********   9
    *****     5
      *       1

--------14---------

      **       2
    ******     6
  **********   10
************** 14
************** 14
  **********   10
    ******     6
      **       2
    ******     6
  **********   10
************** 14
************** 14
  **********   10
    ******     6
      **       2

--------15---------

       *        1
     *****      5
   *********    9
 *************  13
*************** 15
 *************  13
   *********    9
     *****      5
       *        1
     *****      5
   *********    9
 *************  13
*************** 15
 *************  13
   *********    9
     *****      5
       *        1

--------16---------

       **        2
     ******      6
   **********    10
 **************  14
**************** 16
 **************  14
   **********    10
     ******      6
       **        2
     ******      6
   **********    10
 **************  14
**************** 16
 **************  14
   **********    10
     ******      6
       **        2

--------17---------

        *         1
      *****       5
    *********     9
  *************   13
***************** 17
***************** 17
  *************   13
    *********     9
      *****       5
        *         1
      *****       5
    *********     9
  *************   13
***************** 17
***************** 17
  *************   13
    *********     9
      *****       5
        *         1

--------18---------

        **         2
      ******       6
    **********     10
  **************   14
****************** 18
****************** 18
  **************   14
    **********     10
      ******       6
        **         2
      ******       6
    **********     10
  **************   14
****************** 18
****************** 18
  **************   14
    **********     10
      ******       6
        **         2

--------19---------

         *          1
       *****        5
     *********      9
   *************    13
 *****************  17
******************* 19
 *****************  17
   *************    13
     *********      9
       *****        5
         *          1
       *****        5
     *********      9
   *************    13
 *****************  17
******************* 19
 *****************  17
   *************    13
     *********      9
       *****        5
         *          1

--------20---------

         **          2
       ******        6
     **********      10
   **************    14
 ******************  18
******************** 20
 ******************  18
   **************    14
     **********      10
       ******        6
         **          2
       ******        6
     **********      10
   **************    14
 ******************  18
******************** 20
 ******************  18
   **************    14
     **********      10
       ******        6
         **          2

关于c - C 中的星形图案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26343889/

相关文章:

algorithm - 0..N 中输入的平均间隔数

java - 递归 - 在二进制表示中查找 1 的连续计数

c# - 一个棘手的 DateTime 算法问题

c - C中的Blowfish加解密

c++ - 是否可以以编程方式将 SQLite 数据库转换为 C/C++ 中的 SQL 语句?

c - 线程进给其他多线程

c - void* 类型转换为 char* 的增量失败

java - Java中高效的二项式随机数生成器代码

c - 获取字符串的第一个字符

c - 如何阻止 pthread 从 main 打印全局变量然后继续 pthread?