Чтобы решить вопросы об 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;
И затем мы зацикливаемся, пока количество пробелов не станет меньше одного:
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
создается:
**
**
***
* *
***
*****
** **
* *
** **
*****
********
*** ***
** **
* *
** **
*** ***
********
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
*********************************
**************** ****************
*************** ***************
************** **************
************* *************
************ ************
*********** ***********
********** **********
********* *********
******** ********
******* *******
****** ******
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
****** ******
******* *******
******** ********
********* *********
********** **********
*********** ***********
************ ************
************* *************
************** **************
*************** ***************
**************** ****************
*********************************
person
Willem Van Onsem
schedule
22.02.2015