距离蓝桥杯倒计时十天,猿猿的蓝桥杯突击之旅。突击一:
题目
打印图形
时间限制: 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时,列=(星星)的数量+“ ”(空格)的数量
* 星星有3n-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();
}
}
}
评论区