算法训练 输出米字形
资源限制
时间限制:1.0s 内存限制:512.0MB
根据输入的正整数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
分析:
本题目要求是输出米字形,要求是 正整数n (1 米字形由一个(2n-1)*(2n-1)的矩阵组成。把他当作数组来进行模拟,也就是一个二位数组行和列都是2*n-1,数组中心数为n的值 例如:n=3时,包含A,B,C;n=4时,包含A,B,C,D。根据样例输出可以数组最中心的值为n,我们可以使用char(64+n)来表示,分为西北、正北、东北、正西、正东、西南、正南、东南八个方向来做,这类题目不难就是比较麻烦,掌握其规律就比较容易了。
代码详细解读:
import java.util.Iterator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
//用n来接受n传入的值
int n=sc.nextInt();
//定义一个char类型的二位数组,用来存放[2*n-1][2*n-1]个大小的数据;
char arr[][]=new char[2*n-1][2*n-1];
//对数组进行初始化,设置为'.'
for (int i = 0; i < 2*n-1; i++) {
for (int j = 0; j < 2*n-1; j++) {
arr[i][j]='.';
}
}
//我们先设置好数组的中心arr[n-1][n-1]为中心
char c=(char) (64+n);
//给数组中心赋值为(64+n)也就是大写字母
arr[n-1][n-1]=c;
//给西北方向赋值i和j没次-1
// 22——>11——>00这样的格式,然后按照arr[i+1][i+1]-1,对下一个就等于的上一个-1
//西北
for (int i = n-2; i>-1; i--) {
arr[i][i]=(char) (arr[i+1][i+1]-1);
}
// 和西北大致相同
// 东南是i-1 j+1的格式进行可以
//东南
for (int i = n; i<2*n-1; i++) {
arr[i][i]=(char) (arr[i-1][i-1]-1);
}
// 和东南类似
//东北
int u=n;
for (int i = n-2; i>=0; i--) {
arr[i][u]=(char) (arr[i+1][u-1]-1);
u++;
}
// 正南和正北只需要对y的值进行变化即可
//西南
int k=n-2;
for (int i = n;i<2*n-1; i++) {
arr[i][k]=(char) (arr[i-1][k+1]-1);
k--;
}
//正北
for (int i = n-2; i >-1; i--) {
arr[i][n-1]=(char) (arr[i+1][n-1]-1);
}
// 正西和正东只需要对x的值进行变化即可
//正西
for (int i = n; i<2*n-1; i++) {
arr[i][n-1]=(char) (arr[i-1][n-1]-1);
}
//正东
for (int i = n; i <2*n-1; i++) {
arr[n-1][i]=(char) (arr[n-1][i-1]-1);
}
//正西
for (int i = n-2; i>=0; i--) {
arr[n-1][i]=(char) (arr[n-1][i+1]-1);
}
for (int i = 0; i < 2*n-1; i++) {
for (int j = 0; j <2*n-1 ; j++) {
if(arr[i][j]!=' ')
System.out.print(arr[i][j]);
}
System.out.println();
}
}
}