java - 如何在Java中打印给定的菱形图案?

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

最佳答案

要解决有关 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。

现在,在每一行,空格数量增加 2,因此星号数量减少 1。如果只剩下一个星号,循环就会停止。所以你可以将其重写为:

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演示。

适用尺寸235811、和33,这会生成:

**
**

***
* *
***

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

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

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

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

关于java - 如何在Java中打印给定的菱形图案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28661495/

相关文章:

java - 在没有 SPSS 许可证的情况下从 Python、Java (groovy/grails) 或 C++ 应用程序访问 SPSS 数据?

java - 如何使内部 Java 包在 Eclipse 中可访问?

r - 从一个小标题创建单独的图并将每个图单独保存在 R 中

algorithm - 最小化随机矩形中的重叠

c - 将 ppm 转换为 ascii art 的方法无法正常工作

java - 由于输入结束, jackson 无法映射空数组,没有内容可映射到对象

java - 无法全部替换为美元符号

javascript - 循环/迭代要返回的对象数组和字符串数组 - Javascript

php - 生成平滑的十六进制梯度表

c++ - 将 "ascii art"printf 放入 char 数组?