侧边栏壁纸
博主头像
SeaDream乄造梦

Dream,Don't stop a day of hard and don't give up a little hope。 ——不停止一日努力&&不放弃一点希望。

  • 累计撰写 39 篇文章
  • 累计创建 20 个标签
  • 累计收到 13 条评论

目 录CONTENT

文章目录

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

SeaDream乄造梦
2022-03-29 / 0 评论 / 0 点赞 / 463 阅读 / 3,021 字
温馨提示:
亲爱的,如果觉得博主很有趣就留下你的足迹,并收藏下链接在走叭

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

题目


打印图形
时间限制: 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();
			}
			
		}
	}
0

评论区