总体分析:
首先,不论打印平面图形或者3D图形,都是采用分层打印的方法;对于程序打印平面规律图形来说,可以利用双重循环进行打印,外层循环控制打印的层数,内层循环控制每一层打印的内容,当打印完一层后,就换行打印下一层。
1:打印实心钻石
代码如下:
package net.algchallenge;
import java.util.Scanner;
public class PrintSolidDiamond {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//注意:因为是同一行要打印多个空白和星星,所以要利用System.out.print();然后当打印了钻石的一行的时候就启动换行,不然所有的空白和星星都在同一行里
while (true) {
System.out.print("row = ");
int row = sc.nextInt();//定义钻石的行数
if (row % 2 == 0) {//如果钻石的行数为偶数
row++;//钻石行数为偶数时,行数+1,就可以实现行数为奇数时的上下对称情况
for (int i = 1; i <= row; i++) {
if (i <= row / 2) {
for (int j = 1; j <= row / 2 - i + 1; j++) {//打印空白:当打印的是钻石的上层时,空白的个数成递减趋势,所以要使用row - i的形式
System.out.print(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print("*");//打印星星:当打印的是钻石上层的时候,星星个个数成递增趋势,并且每一行的个数为2*i-1
}
System.out.println();
} else {//打印下层的星星和空白,可根据上层推导而来
for (int j = 1; j <= i - (row / 2 + 1); j++) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * (row - i) + 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
} else {//如果钻石的行数为奇数
for (int i = 1; i <= row; i++) {
if (i <= row / 2) {
for (int j = 1; j <= row / 2 - i + 1; j++) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print("*");
}
System.out.println();
} else {
for (int j = 1; j <= i - (row / 2 + 1); j++) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * (row - i) + 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
}
}
}
效果如图:
2:打印空心钻石
分析:打印空心钻石相比实心钻石没有太大区别,只是在打印每一层具体内容的时候,加了一些判断条件。
代码如下:
package net.algchallenge;
import java.util.Scanner;
public class PrintHollowDiamond {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("row = ");
int row = sc.nextInt();
if (row % 2 != 0) {
for (int i = 1; i <= row; i++) {
if (i <= row / 2) {
for (int j = 1; j <= row / 2 - i + 1; j++) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
if (i > 1 && i <= row / 2) {
if (j > 1 && j < 2 * i - 1) {
System.out.print(" ");
} else {
System.out.print("*");
}
} else {
System.out.print("*");
}
}
System.out.println();
} else {
for (int j = 1; j <= i - (row / 2 + 1); j++) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * (row - i) + 1; j++) {
if (i >= row / 2 + 1 && i < row) {
if (j > 1 && j < 2 * (row - i) + 1) {
System.out.print(" ");
} else {
System.out.print("*");
}
} else {
System.out.print("*");
}
}
System.out.println();
}
}
} else {
row++;
for (int i = 1; i <= row; i++) {
if (i <= row / 2) {
for (int j = 1; j <= row / 2 - i + 1; j++) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
if (i > 1 && i <= row / 2) {
if (j > 1 && j < 2 * i - 1) {
System.out.print(" ");
} else {
System.out.print("*");
}
} else {
System.out.print("*");
}
}
System.out.println();
} else {
for (int j = 1; j <= i - (row / 2 + 1); j++) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * (row - i) + 1; j++) {
if (i >= row / 2 + 1 && i < row) {
if (j > 1 && j < 2 * (row - i) + 1) {
System.out.print(" ");
} else {
System.out.print("*");
}
} else {
System.out.print("*");
}
}
System.out.println();
}
}
}
}
}
}
效果如图: