经典算法_01 打印六芒星、打印图形练习

距离蓝桥杯倒计时十天,猿猿的蓝桥杯突击之旅。突击一:

题目


打印图形
时间限制: 1.0s 内存限制: 512.0MB
【问题描述】
小明刚学习完条件语句和循环语句,并且也打印了许多图形,比如菱形或者三角形。然后他突发奇想要打印一个六芒星,果然,他用了半小时就把六芒星给打印出来了,你能比他更快吗?小明为你加油哦!
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一个六芒星,表示满足题意的图形。
【样例输入】
3
4
【样例输出】
在这里插入图片描述
在这里插入图片描述


注:解法一较简单,解法二偏重于逻辑

解法一及分析

  /**  思路
   * 打印两个三角形,头向上的边长==边长,头向下的边长==边长+(边长-1)
   *输入数字n--对应的三角形边长
   * 3---7=3+2*(3-1),头朝下的三角形底边在第3行
   * 4---10=4+2*(4-1),头朝下的三角形底边在第4行
   * 5--13=5+2*(5-1)
   * 推出边长与n的关系:边长==n+2*(n-1)
   * 根据以上逻辑得总行数:为头向上的边长+(n-1)(空格) :(n+2*(n-1))+(n-1)     n=3时,为9
   * 			  总列数:边长+边长-1  : 2*(n+2*(n-1)) -1     n=3时,为13
   */
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		/**   分析题意
		 * 打印两个三角形,头向上的边长==边长,头向下的边长==边长+(边长-1)
		 * 3---7=3+2*(3-1),头朝下的三角形底边在第3行
		 * 4---10=4+2*(4-1),头朝下的三角形底边在第4行
		 * 5--13=5+2*(5-1)
		 * 推出边长与n的关系:边长==n+2*(n-1)
		 * 根据以上逻辑得总行数:为头向上的边长+(n-1)(空格) :(n+2*(n-1))+(n-1)     n=3时,为9
		 * 			  总列数:边长+边长-1  : 2*(n+2*(n-1)) -1     n=3时,为13
		 */
		int sideLength = n+2*(n-1);
		int row = sideLength+(n-1);
		int clomn = sideLength*2-1;
		String [][] arr = new String[row][clomn];
		//中间值
		int mid = clomn/2;
		//初始化数组
		for(int i=0;i<row;i++) {
//1. 画头向上的三角形
//			System.out.println(i);
			for(int j=0;j<clomn;j++) {
				//1. 画头向上的三角形的腰
				if(i==0) {
					arr[i][mid] = "*";
				}else {
					if(mid-i>=0) {
						arr[i][mid-i] = "*";
						arr[i][mid+i] = "*";
					}
				}
			}
			//画头向上的底边
			if(i==sideLength-1) {
				for (int k=0;k<clomn;k=k+2) {
					if(k<clomn-2)
					arr[i][k] = "*";
				}
			}
		}
		
		int k=0;
		for(int i=row-1;i>=0;i--) {
//2. 画头向下的三角形
//			System.out.println(i);

			for(int j=0;j<clomn;j++) {
				//1. 画头向下的三角形腰
				if(i==row-1) {
					arr[i][mid] = "*";
				}else {
					if(mid-k>=0) {
//					System.out.println("mid:"+mid+" "+"k: "+k );
						arr[i][mid-k] = "*";
						arr[i][mid+k] = "*";
					}
				}
				
			}
			k++;
			//画头向下的底边
			if(i==n-1) {
				for (int l=0;l<clomn;l=l+2) {
					if(l<clomn-2)
					arr[i][l] = "*";
				}
			}
		}

		//遍历数组
		for(String [] a:arr) {
			for (String b:a) {
				if(b==null) {
					b=" ";
				}
				System.out.print(b);
			}
			System.out.println();
		}
		
	}
}

解法二及分析

/行4a-3和列6a-5和单个三角形3a-2的由来
* 把整个六芒星看成六个三角形,每个三角形的边长为a
* 1.列
* n=3时,列=(星星)的数量+“ ”(空格)的数量
* 星星有3
n-2个(有两个重复的所以要减去),空格有3
(n-1)个
* 所以,列=星星+空格=(3n-2)+3
(n-1)=6n-5
* 2.行
* 四个三角形的高减去3个重复的地方,所以, 行=4a-3
* 3.单个三角形高3a-2
* 三个小三角形-2个重叠部分
* 4.减1的原因:数组是从0开始,而行和列是自然数算的
*/

	/**行4a-3和列6a-5和单个三角形3a-2的由来
	 * 把整个六芒星看成六个三角形,每个三角形的边长为a
	 * 1.列  
	 *   n=3时,列=*(星星)的数量+“ ”(空格)的数量
	 *   	星星有3*n-2个(有两个重复的所以要减去),空格有3*(n-1)个
	 *   			所以,列=星星+空格=(3n-2)+3*(n-1)=6n-5
	 * 2.行
	 * 	 四个三角形的高减去3个重复的地方,所以,  行=4a-3
	 * 3.单个三角形高3a-2
	 * 三个小三角形-2个重叠部分
	 * 4.减1的原因:数组是从0开始,而行和列是自然数算的
	 */
import java.util.Scanner;
public class Main {
		public static void main(String[] args) {
			Scanner scanner = new Scanner(System.in);
			int a =scanner.nextInt();
			String [][] arr=new String[4*a-3][6*a-5];
//			获取中心点
			int center = (6*a-5)/2 + 1;
//			单个三角形的高
			int row = 3*a-2;
			boolean isEmpty=true;
			for(int i=0;i<row;i++) {
//				正三角形
					//左右两边
					arr[i][center-1-i] = "*";
					arr[i][center-1+i] = "*";
//				倒三角形
					//左右两边
					arr[4*a-3-i-1][center-1-i] = "*";
					arr[4*a-3-i-1][center-1+i] = "*";
					//底边
					if(i==row-1) {
						isEmpty=true;
						for(int j=0;j<(6*a-5)-2;j++) {
							if(isEmpty) {
								isEmpty=false;//跳过执行当前j
							}else {
								arr[i][j+1] = "*";
								arr[a-1][j+1] = "*";
								isEmpty=true;	
							}						
						}
					}
			}
			for(String[] m:arr) {
				for(String n:m) {
					if(n==null) {
						System.out.print(" ");
					}else {
						System.out.print(n);
					}
					
				}
				System.out.println();
			}
			
		}
	}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱代码的猿猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值