如何用Java打印给定的菱形图案?

时间:2015-02-22 18:22:07

标签: java loops ascii-art

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

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

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;
            }
        }
    }
}

6 个答案:

答案 0 :(得分:2)

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

  

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

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();

                }
        }
}

希望有所帮助:)

答案 1 :(得分:2)

要解决有关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 :(得分:0)

这是我对你想要的精确钻石图案的解决方案。

我有一个方法,这使我更容易打印。

    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);

说实话,有一些暴力逻辑,但整体想法很简单。我通过计数器变量跟踪间距,并分别打印钻石的顶部和底部。

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

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

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

答案 3 :(得分:0)

我更喜欢简洁明了的答案。我利用钻石的水平和垂直对称轴: 想法是计算钻石的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 :(得分:0)

您可以使用两个嵌套的在从 -nn 的行和列上打印一个刻在正方形中的空菱形。当 n > 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 :(得分:0)

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