试题 算法训练 输出米字形

题目描述
  根据输入的正整数n (1  米字形由一个(2n-1)*(2n-1)的矩阵组成,矩阵包含从大写A开始的n个字母
  例如:n=3时,包含A,B,C;n=4时,包含A,B,C,D。
  矩阵的正中间为n个字母中字典序最大的那个,从这个字母开始,沿着西北、正北、东北、正西、正东、西南、正南、东南八个方向各有一条由大写字母组成的直线。并且直线上的字母按字典序依次减小,直到大写字母A。
  矩阵的其它位置用英文句号.填充。

样例输入一
  3

样例输出一
  A.A.A
  .BBB.
  ABCBA
  .BBB.
  A.A.A

样例输入二
  4

样例输出二
  A..A..A
  .B.B.B.
  ..CCC..
  ABCDCBA
  ..CCC..
  .B.B.B.
  A..A..A
  
资源限制
时间限制:1.0s 内存限制:512.0MB

思路
像这种图形打印的题目,一般都是由外向内,一般都是不难的,主要是思路,逻辑性不强!!!
这题的思路主要就是接收用户输入的数字,转化为边长大小,传入f()方法处理,然后再main()方法内打印。
1,因为需要打印的字母是会随着用户输入的数字变化而变化的,所以需要定义一个字符变量w,每循环一次加一。
2,而且不管输入的边长有多大,每条边上的字母都是只有三个!所以每次循环变化的增量 add 需要和w一样改变。规律是什么?下面是我画的的规律:
在这里插入图片描述

ps:
如果用户输入小于3的数字n,那么每次的增量 add 变化为边长b除以3然后再加0(n/3);(2/3=0)
如果用户输入小于5的数字n,那么每次的增量 add 变化为边长b除以3然后再加1(n/3);(5/3=1)
如果用户输入小于8的数字n,那么每次的增量 add 变化为边长b除以3然后再加2(n/3);(8/3=2)
以此类推……

3,因为图像是由外向内一层一层打印的,所以每次开始打印的坐标点是不同的,本题中以左上点为起点开始打印,每打印完一层,start++,end–
4,最后在说明一下,介于增量add会出现小于等于0的情况,所以出现这种情况的时候将add更新为1,即每次变化1。退出循环的条件是打印完用户输入的层数。
代码相对简单,不懂或不足之处可以指出^ _ ^

代码块

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		//接收用户输入的“边长”
		n = sc.nextInt();
		//如果边长为1,直接输出得了
		if(n == 1){
			System.out.println("A");
			return;
		}
		int b = n*2-1;
		char arr[][] = new char[b][b];
		for(int i = 0; i < b; i++){
			for(int j = 0; j < b; j++){
				arr[i][j] = '.';
			}
		}
		
		f(arr, b);
		
		//打印结果图像
		for(int i = 0; i < b; i++){
			for(int j = 0; j < b; j++){
				System.out.print(arr[i][j]);
			}
			System.out.println();
		}
	}
	
	static int n;
	static void f(char ch[][], int b){
		int start = 0;
		int end = b-1;
		char w= 'A';
		int add = b/3+n/3;
		
		int cnt = 0;
		while(true){
			//由外向内
			for(int i = start; i <= end; i+=add){
				ch[i][start] = w;//左
				ch[start][i] = w;//上
				ch[i][end] = w;//右
				ch[end][i] = w;//下
			}
			start++;
			end--;
			w++;
			add = add - 1;
			if(add <= 0)add =1;
			
			cnt++;
			if(cnt == n)break;
		}
	}
}

评测结果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值