题目描述:
根据输入的正整数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;
}
}
}
评测结果: