package exec;
import java.util.Scanner;
/**
根据输入的正整数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
* @author Vivinia
*
* 2018年2月3日
*/
public class FuShu {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
input.close();
int l=2*n-1; //数组的行列数
char[][] mi=new char[l][l];
for(int i=0;i<l;i++) {
for(int j=0;j<l;j++) {
if(i==j) { //正对角线\
if(i<=n-1)
mi[i][j]=(char) ('A'+i);
else
mi[i][j]=mi[i-2*(i-(n-1))][i-2*(i-(n-1))]; //下半部分等于上半部分
}
else if(i==l-1-j) { //副对角线/
if(i>j)
mi[i][j]=mi[j][j]; //下半部分
else
mi[i][j]=mi[i][i]; //上半部分
}
else if(i==n-1) { //中间横向
if(j<=n-1)
mi[i][j]=(char) ('A'+j);
else
mi[i][j]=mi[j-2*(j-(n-1))][j-2*(j-(n-1))]; //右半部分等于左半部分
}
else if(j==n-1) { //中间纵向
if(i<=n-1)
mi[i][j]=(char) ('A'+i);
else
mi[i][j]=mi[i-2*(i-(n-1))][i-2*(i-(n-1))]; //下半部分等于上半部分
}
else
mi[i][j]='.'; //其余地方用.填充
}
}
for(int i=0;i<l;i++) {
for(int j=0;j<l;j++)
System.out.print(mi[i][j]);
System.out.println();
}
}
}
逻辑稍微有点复杂的是对应关系,不管横向纵向还是斜着,前半部分递增的是比较好输出的,后半部分递减需要找到和坐标位置的变化规律。