打印六芒星_java

题目要求

【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一个六芒星,表示满足题意的图形。
【样例输入】
3
4
【样例输出】
示例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();
        }
    }
}

总结

细心的人可能看到有许多重复的循环,改进一下可以使代码更加整洁并减少时间复杂度,这里只是为了方便理解。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值