题目要求
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一个六芒星,表示满足题意的图形。
【样例输入】
3
4
【样例输出】
【评测用例规模与约定】
对于所有评测用例,1 ≤ n ≤ 20。
总体思路
六芒星可以看成是两个三角形组成,如图:
所以只要分别写出来这两个三角形,最后组合在一起即可。
具体实现
既然是图形问题,那么可以用二位数组来存储,我这里用的是二维字符数组,其中
char[][] topShape = new char[4*n-3][6*n-5];
//表示上面的三角形
char[][] botShape = new char[3*n-2][6*n-5];
//表示下面的三角形
然后再解释一下数组的大小,先说一下上面三角形的大小(包括自己和下面的大小),下面三角形的很容易就出来了。例如这个示例,整个黄框表示第一个数组的二维平面大小,其中高度为4个三角形的高度减去3条重复高,用数学式表示就是4*n-3。,如图:
而宽度就是3个三角形宽减去2个重复宽,也就是(n+n-1)*3-2=6n-5,其中(n为*号数量,n-1为空格数量),如图:
得到了上面三角形大小,下面三角形只要取它自己的部分即可,宽度与上面相同,而高度只要照上面的-(n-1)即可,也即4n-3-(n-1)=3n-2如图:
接着讨论一下什么时候是‘*’,什么时候是‘ ’,先看一下上面三角形,可以先选取一个中点,然后没下一层,‘*’就会向两端移动,如图:
用伪代码看一下
mid = 中间位置
if (i1==mid||i1==6*n-6-mid) topShape[i][i1] = '*';
//if中可以理解成,从左边数到星的距离(i1==mid)跟从右边数到星的距离(i1==6*n-6-mid),i1==mid好理解,而i1因为是下标所以6*n-5-mid还得再-1
然后三角形最后一行用一个判断语句,如果到最后一行,就整行用星星和空格依次填入(用奇偶位置判断),
if (i1%2==0) topShape[i][i1] = '*';
else topShape[i][i1] = ' ';
下面那个倒三角跟正三角差不多一直实现思路。
两个三角形都实现后,那么就可以把第二个三角形“粘”到第一个上面。
代码片
public class SixStar {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
char[][] ans = creatStar(n);
printSixStar(ans);
}
//构造图形数组函数
public static char[][] creatStar(int n){
char[][] topShape = new char[4*n-3][6*n-5];
char[][] botShape = new char[3*n-2][6*n-5];
//第一步修改上层图形
int mid = 3*n-3;
for (int i = 0; i < topShape.length; i++) {
for (int i1 = 0; i1 < topShape[i].length; i1++) {
if (i<3*n-3){
if (i1==mid||i1==6*n-6-mid) topShape[i][i1] = '*';
else topShape[i][i1] = ' ';
}else if (i == 3*n-3){
if (i1%2==0) topShape[i][i1] = '*';
else topShape[i][i1] = ' ';
}else{
topShape[i][i1] = ' ';
}
}
--mid;
}
//第二部修改下层图形是反的
mid=0;
for (int i = 0; i < botShape.length; i++) {
for (int i1 = 0; i1 < botShape[i].length; i1++) {
if (i>0){
if (i1==mid||i1==6*n-6-mid) botShape[i][i1] = '*';
else botShape[i][i1] = ' ';
}else{
if (i1%2==0) botShape[i][i1] = '*';
else botShape[i][i1] = ' ';
}
}
++mid;
}
//第三步合并两个图形
for (int i = n-1; i < topShape.length; i++) {
for (int i1 = 0; i1 < topShape[i].length; i1++) {
if (botShape[i-n+1][i1] == '*') topShape[i][i1] = '*';
}
}
return topShape;
}
//打印图形函数
public static void printSixStar(char[][] ans){
for (char[] an : ans) {
for (char c : an) {
System.out.print(c);
}
System.out.println();
}
}
}
总结
细心的人可能看到有许多重复的循环,改进一下可以使代码更加整洁并减少时间复杂度,这里只是为了方便理解。