算法训练 输出米字形
资源限制
时间限制: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(); } } }