打印十字图
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
一个正整数 n (n<30) 表示要求打印图形的层数
输出:
对应包围层数的该标志。
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
一个正整数 n (n<30) 表示要求打印图形的层数
输出:
对应包围层数的该标志。
思路:请仔细观察样例,尤其要注意句点的数量和输出位置。
可以看出这是一个正方形 四个角凹回去的,所以这就简单了,上下对称 只要把每个圈的第一二三层输完 其余即可一次全输出
import java.util.Scanner;
public class 打印十字图 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int n=s.nextInt();
String d[][]=new String[5+4*n][5+4*n];//是个正方形,可以得出 每多一层是在外面多了4个格子
for(int o=0;o<n;o++){//总共有n层,由外往内层画十字
for(int i=2*o;i<5+4*n-2*o;i++){//5+4*n为最外层正方形的边长,o为当前正在打印的层数 每打印一层右边少2格
if(i==2*o||i==5+4*n-2*o-1){//第1层和最后1层是对称的
for(int j=2*o;j<5+4*n-2*o;j++){
if(j>1+2*o&&j<5+4*n-2*o-2)
d[i][j]="$";
else d[i][j]=".";
}
}
else if(i==1+2*o||i==5+4*n-2*o-2){
for(int j=2*o;j<5+4*n-2*o;j++){
if(j==2+2*o||j==5+4*n-2*o-3)
d[i][j]="$";
else d[i][j]=".";
}
}
else if(i==2+2*o||i==5+4*n-2*o-3){
for(int j=2*o;j<5+4*n-2*o;j++){
if(j<3+2*o||j>5+4*n-2*o-4)
d[i][j]="$";
else d[i][j]=".";
}
}
else{
for(int j=2*o;j<5+4*n-2*o;j++){
if(j==2*o||j==5+4*n-2*o-1)
d[i][j]="$";
else d[i][j]=".";
}
}
}
}
for(int i=(5+4*n)/2-2;i<(5+4*n)/2+3;i++){//打印中间十字
for(int j=(5+4*n)/2-2;j<(5+4*n)/2+3;j++){
if(i==(5+4*n)/2)
d[i][j]="$";
else if(j==(5+4*n)/2)
d[i][j]="$";
else d[i][j]=".";
}
}
for(int o=0;o<n;o++){//因为是按照正方形来打印的 所以四个角的‘$’在每次打印内层后会被覆盖为‘.’,所以最后再将其变会‘$’。
for(int j=2+2*o;j<5+4*n-2*o-2;j=5+4*n-2*o-3){//若此段代码不理解 可将此段代码删去后 看一下区别即可
d[j][2+2*o]=d[j][5+4*n-2*o-3]="$";
if(j==5+4*n-2*o-3)
break;
}
}
for(int i=0;i<5+4*n;i++){
for(int j=0;j<5+4*n;j++)
System.out.print(d[i][j]);
System.out.println();
}
}
}