钻石轮廓模式java使用循环

时间:2017-02-12 20:29:08

标签: java loops for-loop

我是java的新手,我在尝试获取所需的输出时遇到了一些麻烦。 我正在尝试使用java中的嵌套循环制作Diamond轮廓图案。我需要的输出是:

    1
   2 2
  3   3
 4     4
  3   3
   2 2
    1 

行数基于用户输入。 到目前为止,我可以想出这个:

public static void drawDiamond(int n) {
    int space = n - 1;
    for (int i = 1; i <= n; i++) {

        for (int j = space; j >= 1; j--)
            System.out.print(" ");

        for(int k = 1; k <= i; k++)
            System.out.print(i + " ");

        System.out.println();
        space--;

    }

这是我输出的n = 5

     1 
    2 2 
   3 3 3 
  4 4 4 4 
 5 5 5 5 5 

请帮我搞定这种模式

2 个答案:

答案 0 :(得分:0)

好的,这是你必须要看的。

  1. 忽略顶部和底部点。那些很容易画。我们将创建一个for循环,打印每行包含2个字符的中间部分。
  2. 制作一个接受整数n并打印n个空格的方法。
  3. 计算出钻石左右两侧每条线所需的空间。这是如何:
  4. 左侧:
    例子n = 4(与上述相同)。如果n = 4,我们需要打印5行包含2个字符的行。我们需要弄清楚每条线左侧需要多少个空间。 x是行#,y是空格数。

    x y
    1 3
    2 2
    3 1
    4 2
    5 3

    现在我们需要一个线性函数,y = mx + b,它将创建上表 答案是y = | x-3 | +1。

    现在,而不是n = 4的例子,这个线性函数对于任何n都是什么? Y = | X-(N-1)| 1
    。 或者,在java中,
    int y = Math.abs(x - (n-1))+ 1;

    右侧 现在,重复钻石的右侧。 X是第#行,y是所需空格数。

    x y
    1 2
    2 4
    3 6
    4 4
    5 2

    同样,我们需要一个创建此表的线性函数 答案是y = 6- | 3-x | * 2.。

    同样,对于任何一个,你都会得到 int y =(2 *(n-1)) - Math.abs((n-1) - x)* 2;

    填写#而不是x并打印顶部和底部点应该很容易,下面不包括它。
     做完这一切之后,我意识到顶点和底点不能是一个完美的点(不能做半空间),所以功能需要修改以下...
    int secondSpace =(2 *(n-1)) - Math.abs((n-1) - i)* 2;
    将成为
    int secondSpace =(2 *(n-1)) - Math.abs((n-1) - i)* 2-1;

        public static void drawDiamond(int n) {
            int numbLinesWith2xs = 2*n - 3;
            for (int i = 1; i <= numbLinesWith2xs; i++) {
                int firstSpace = Math.abs(i - (n-1)) + 1;
                int secondSpace = (2*(n-1)) - Math.abs((n-1) - i)*2;
    
                printSpaces(firstSpace);
                System.out.print("x");
                printSpaces(secondSpace);
                System.out.println("x");
            }
        }
    
        public static void printSpaces(int n) {
            for (int i=1; i<=n; i++) {
                System.out.print(" ");
            }
        }
    
     //RESULT for drawDiamond(8):
    
           x  x
          x    x
         x      x
        x        x
       x          x
      x            x
     x              x
      x            x
       x          x
        x        x
         x      x
          x    x
           x  x
    
    包含所有内容的最终解决方案:

    public static void drawDiamond(int n) {
            int numbLinesWith2xs = 2*n - 3;
            printSpaces(n);
            System.out.println("1");
            for (int i = 1; i <= numbLinesWith2xs; i++) {
                int firstSpace = Math.abs(i - (n-1)) + 1;
                int secondSpace = (2*(n-1)) - Math.abs((n-1) - i)*2-1;
                printSpaces(firstSpace);
                System.out.print(secondSpace/2+2);
                printSpaces(secondSpace);
                System.out.println(secondSpace/2+2);
            }
            printSpaces(n);
            System.out.println("1");
        }
    
    
        1
       2 2
      3   3
     4     4
      3   3
       2 2
        1
    

答案 1 :(得分:0)

你足够接近,只是一些小改动

public static void drawDiamond(int n) {
    int spaces = n - 1;
    for (int i = 0; i < 2 * n - 1; i++) {
        for (int j = 0; j < spaces; j++)
            System.out.print(" ");
        System.out.print(n - spaces);
        for (int j = 0; j < (2 * n - 2 * spaces - 3); j++)
            System.out.print(" ");
        if (i != 0 && i != 2 * n - 2)
            System.out.print(n - spaces);
        if (i < ((2 * n) - 1) / 2)
            spaces--;
        else
            spaces++;
        System.out.println();
    }
}