***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
基本上我只需要正确放置空格的想法。 到目前为止我的代码。
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));
}
现在,下部部分只需通过相反的过程即可生产。首先,我们需要撤消最后的 na
和 ns
增量减量:
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演示。
适用尺寸2
、3
、5
、8
、11
、和33
,这会生成:
**
**
***
* *
***
*****
** **
* *
** **
*****
********
*** ***
** **
* *
** **
*** ***
********
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
*********************************
**************** ****************
*************** ***************
************** **************
************* *************
************ ************
*********** ***********
********** **********
********* *********
******** ********
******* *******
****** ******
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
****** ******
******* *******
******** ********
********* *********
********** **********
*********** ***********
************ ************
************* *************
************** **************
*************** ***************
**************** ****************
*********************************
关于java - 如何在Java中打印给定的菱形图案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28661495/