要解决有关 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));
}
现在下半部分是通过相反的过程简单地生产出来的。首先我们需要撤消最后的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,这会生成:
**
**
***
* *
***
*****
** **
* *
** **
*****
********
*** ***
** **
* *
** **
*** ***
********
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
*********************************
**************** ****************
*************** ***************
************** **************
************* *************
************ ************
*********** ***********
********** **********
********* *********
******** ********
******* *******
****** ******
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
****** ******
******* *******
******** ********
********* *********
********** **********
*********** ***********
************ ************
************* *************
************** **************
*************** ***************
**************** ****************
*********************************