【问题标题】:How to print a given diamond pattern in Java?如何在 Java 中打印给定的菱形图案?
【发布时间】:2015-02-22 18:22:06
【问题描述】:
***********
***** *****
****   ****
***     ***
**       **
*         *
**       **
***     ***
****   ****
***** *****
***********

基本上我只需要正确放置空格的想法。 到目前为止我的代码。

public class Pyramid3 {

    public static void main(String[] args) {

        int i, j;
        int noOfCol = 11;

        for (i = 1; i <= 11; i++) {

            for (j = 1; j <= noOfCol; j++) {
                System.out.print("*");
            }

            System.out.println();

            if (i == 1) {
                noOfCol--;
            } else if (i > 1 && i < 6) {
                noOfCol = noOfCol - 2;
            } else if (i > 6) {
                noOfCol = noOfCol + 2;
            }
        }
    }
}

【问题讨论】:

    标签: java loops ascii-art


    【解决方案1】:

    要解决有关 ASCII 艺术的问题,可以尝试在不同的行中找到 模式。可以看到每一行都包含多个星号 (*)、多个空格(可能为零)和多个星号。

    所以我们先写一个辅助函数:

    public static String generateRow (int n1, int n2, int n3) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < n1; i++) {
            sb.append('*');
        }
        for(int i = 0; i < n2; i++) {
            sb.append(' ');
        }
        for(int i = 0; i < n3; i++) {
            sb.append('*');
        }
    }
    

    现在我们只需要计算出星号和空格的数量。第一行和最后一行只包含 n 个星号,所以我们可以这样写:

    System.out.println(generateRow(n,0,0));
    

    如果 n 是奇数,则第二行在中间包含一个空格,如果 n 是偶数,则在中间包含两个空格,因此如下所示:

    int ns = 2-(n%2);
    int na = (n-ns)/2;
    System.out.println(generateRow(na,ns,na));
    

    因为 na 是大小减去空格数除以 2。

    现在在每一行,空格的数量增加了两个,所以星号的数量减少了一个。如果只剩下一个星号,则循环停止。因此,您可以将其重写为:

    int ns = 2-(n%2);
    int na = (n-ns)/2;
    for(; na >= 1; na--, ns += 2) {
        System.out.println(generateRow(na,ns,na));
    }
    

    现在下半部分是通过相反的过程简单地生产出来的。首先我们需要撤消最后的nans递增递减:

    na += 2;
    ns -= 4;
    

    然后我们循环直到空格数小于1:

    for(; ns > 1; na++, ns -= 2) {
        System.out.println(generateRow(na,ns,na));
    }
    

    把所有这些放在一起,结果是:

    public static void generateDiamond (int n) {
        System.out.println(generateRow(n,0,0));
        int ns = 2-(n%2);
        int na = (n-ns)/2;
        for(; na >= 1; na--, ns += 2) {
            System.out.println(generateRow(na,ns,na));
        }
        na += 2;
        ns -= 4;
        for(; ns >= 1; na++, ns -= 2) {
            System.out.println(generateRow(na,ns,na));
        }
        System.out.println(generateRow(n,0,0));
    }
    

    jdoodle 演示。

    对于大小 23581133,这会生成:

    **
    **
    
    ***
    * *
    ***
    
    *****
    ** **
    *   *
    ** **
    *****
    
    ********
    ***  ***
    **    **
    *      *
    **    **
    ***  ***
    ********
    
    ***********
    ***** *****
    ****   ****
    ***     ***
    **       **
    *         *
    **       **
    ***     ***
    ****   ****
    ***** *****
    ***********
    
    *********************************
    **************** ****************
    ***************   ***************
    **************     **************
    *************       *************
    ************         ************
    ***********           ***********
    **********             **********
    *********               *********
    ********                 ********
    *******                   *******
    ******                     ******
    *****                       *****
    ****                         ****
    ***                           ***
    **                             **
    *                               *
    **                             **
    ***                           ***
    ****                         ****
    *****                       *****
    ******                     ******
    *******                   *******
    ********                 ********
    *********               *********
    **********             **********
    ***********           ***********
    ************         ************
    *************       *************
    **************     **************
    ***************   ***************
    **************** ****************
    *********************************
    

    【讨论】:

      【解决方案2】:

      这是代码,抱歉文档不好,希望对您有所帮助。

      PS:要解决这样的任何问题,只需使用一张白纸和一支铅笔,然后将列和索引'i'制作成网格,然后计算一个关系,然后你可以将它用作循环条件。

      public class Test {
          public static void main(String[] args) {
              int n = 10;
      
              // Top
              for (int i = n; i > 0; i--) {
                  // Stars
                  for (int j = 0; j < i; j++) {
                      System.out.print("*");
                  }
                  // Spaces
                  for (int j = i; j < n; j++) {
                      System.out.print(" ");
                  }
                  // Stars
                  for (int j = i; j < n; j++) {
                      System.out.print(" ");
                  }
                  // Stars
                  for (int j = 0; j < i; j++) {
                      System.out.print("*");
                  }
                  System.out.println();
              }
      
              // Bottom
              for (int i = 2; i < n + 1/* Note the shift here */; i++) {
                  // Stars
                  for (int j = 0; j < i; j++) {
                      System.out.print("*");
                  }
                  // Spaces
                  for (int j = i; j < n; j++) {
                      System.out.print(" ");
                  }
                  // Spaces
                  for (int j = i; j < n; j++) {
                      System.out.print(" ");
                  }
                  for (int j = 0; j < i; j++) {
                      System.out.print("*");
                  }
                  System.out.println();
              }
          }
      }
      

      希望对你有帮助:)

      【讨论】:

        【解决方案3】:

        我更喜欢简明扼要的答案。我的利用了钻石的水平和垂直对称轴: 这个想法是计算钻石的 1/4,然后首先围绕垂直轴镜像,然后围绕水平轴镜像(_ 是一个空格)

        ******
        *****_
        ****__  
        ***___
        **____
        *_____
        

        首先,给repeat a character n times一个简短的实用函数:

        String repeat(String s, int times) {
          return times == 0 ? "" : new String(new char[times]).replace("\0", s);
        }
        

        这里是代码(使用 Java 8 lambdas 打印结果和this answer for reversing the string

         // height and width of the diamond
        int size = 11;
        // Mhh diamonds
        List<String> l = new ArrayList<>();
        // len includes the axis, too
        for (int i=0, len = size/2 + 1;i<len;i++) {
          String s = repeat("*", len - i) + repeat(" ", i);
          //Mirror, omitting the axis itself and append
          s += (new StringBuilder(s)).reverse().substring(1);
          l.add(s);
        }
        // Print the upper part
        l.forEach(System.out::println);
        // mirror around the horizontal axis
        Collections.reverse(l);
        // Omit the horizontan axis and print the rest
        l.subList(1,l.size()).forEach(System.out::println);
        

        对于任意大小的菱形,8-9 行代码,加上重复方法的 3 行代码。

        结果:

        ***********
        ***** *****
        ****   ****
        ***     ***
        **       **
        *         *
        **       **
        ***     ***
        ****   ****
        ***** *****
        ***********
        

        【讨论】:

          【解决方案4】:

          您可以使用两个嵌套的在从-nn 的行和列上打印一个刻在正方形中的空菱形。 n &gt; iAbs + jAbs时得到菱形:

          int n = 5;
          String[] arr = IntStream
                  .rangeClosed(-n, n)
                  .map(Math::abs)
                  .mapToObj(i -> IntStream
                          .rangeClosed(-n, n)
                          .map(Math::abs)
                          // an empty rhombus inscribed in a square
                          .mapToObj(j -> i + j < n ? " " : "*")
                          .collect(Collectors.joining(" ")))
                  .toArray(String[]::new);
          
          Arrays.stream(arr).forEach(System.out::println);
          

          输出:

          * * * * * * * * * * *
          * * * * *   * * * * *
          * * * *       * * * *
          * * *           * * *
          * *               * *
          *                   *
          * *               * *
          * * *           * * *
          * * * *       * * * *
          * * * * *   * * * * *
          * * * * * * * * * * *
          

          另见:
          Drawing numeric diamond
          Empty diamond shape with numbers

          【讨论】:

            【解决方案5】:

            这是我对您想要的确切菱形图案的解决方案。

            我有一种方法,可以让我更轻松地打印。

            private static void put(char c, int n, boolean NL) {
                for (int a = 0; a < n; a++) System.out.print(c);
                if (NL) System.out.println();
            }
            

            基本上,你告诉它:打印哪个字符,打印多少次,打印完成后是否应该添加新行。

            然后是实际的解决方案:

            put('*', 11, true);
            int count = 0;
            for (int a = 5; a >= 1; a--) {
                put('*', (int) Math.ceil(a), false);
                put(' ', count++ * 2 + 1, false);
                put('*', (int) Math.ceil(a), true);
            }
            count = 4;
            for (int a = 2; a < 6; a++) {
                put('*', (int) Math.ceil(a), false);
                put(' ', count-- * 2 - 1, false);
                put('*', (int) Math.ceil(a), true);
            }
            put('*', 11, true);
            

            说实话,有点蛮力逻辑,但总体思路很简单。我通过计数器变量跟踪间距并分别打印钻石的顶部和底部。

            很抱歉缺少文档,因为我没有太多时间解决这个问题。希望对您有所帮助!

            由于缺乏测试,这里是输出。

            ***********
            ***** *****
            ****   ****
            ***     ***
            **       **
            *         *
            **       **
            ***     ***
            ****   ****
            ***** *****
            ***********
            

            【讨论】:

              【解决方案6】:
              public static void main(String[] args) {
                  int n = 7;
                  for (int i = -n; i <= n; i++) {
                      for (int j = -n; j <= n; j++)
                          if (Math.abs(i) + Math.abs(j) >= n
                                  // in chessboard order
                                  && (i + j) % 2 != 0
                                  // vertical borders
                                  || Math.abs(j) == n)
                              System.out.print("*");
                          else
                              System.out.print(" ");
                      System.out.println();
                  }
              }
              

              输出:

              ** * * * * * **
              * * * * * * * *
              ** * *   * * **
              * * *     * * *
              ** *       * **
              * *         * *
              **           **
              *             *
              **           **
              * *         * *
              ** *       * **
              * * *     * * *
              ** * *   * * **
              * * * * * * * *
              ** * * * * * **
              

              另见:Empty diamond shape with numbers

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-11-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-03-30
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多