蓝桥杯历届试题
## 打印十字图
- 此题说白了就是个规律题,第一眼看到的各位朋友应该耐心的看完
我对此题的规律总结如下:
* 首先用二维数组来保存图形,并初始化为n个正方形相互嵌套,中间有个十字
* 每个正方形的边长为5+4*n,中间十字的长度为5,从中心向四周扩散长度2
* 然后将每个正方形的四个角分别处理,交换对应位置的元素即可,从最里面的正方形开始处理
* 得到正确结果
代码段(java)
package com.yrd.lanqiao.pre;
import java.util.Scanner;
public class Prev_2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int l = 5+4*n;
int mid = l/2+1;
char[][] map = new char[l+10][l+10];
for (int i=1; i<=l; i++) {
for (int j=1; j<=l; j++) {
if(i==1||i==l) {
map[i][j]='$';
} else {
if(j==1||j==l) {
map[i][j]='$';
} else if(i== mid&& (j==mid-2||j==mid-1||j==mid||j==mid+1||j==mid+2)) {
map[i][j]='$';
} else if(j==mid && (i==mid-2||i==mid-1||i==mid+1||i==mid+2)) {
map[i][j]='$';
}else {
map[i][j]='.';
}
}
}
}
for (int cnt=1; cnt<n; cnt++) {
int r1=1+2*cnt, c1=1+2*cnt;
int r2=l-2*cnt, c2=l-2*cnt;
for (int i=1+2*cnt; i<=l-2*cnt; i++) {
map[r1][i] = '$';
map[i][c1] = '$';
map[r2][i] = '$';
map[i][c2] = '$';
}
}
//以上为图形的初始化
//接下来分别处理n个图形的四个角
for (int cnt=1; cnt<=n; cnt++) {
int r1=mid-2-2*cnt, c1=mid-2-2*cnt;
int r2=mid-2-2*cnt, c2=mid+2+2*cnt;
int r3=mid+2+2*cnt, c3=mid-2-2*cnt;
int r4=mid+2+2*cnt, c4=mid+2+2*cnt;
//左上角
change(map,r1,c1,r1+2,c1+1);
change(map,r1,c1+1,r1+2,c1+2);
change(map,r1+1,c1,r1+1,c1+2);
//右上角
change(map,r2,c2,r2+2,c2-1);
change(map,r2,c2-1,r2+2,c2-2);
change(map,r2+1,c2,r2+1,c2-2);
//左下角
change(map,r3,c3,r3-2,c3+1);
change(map,r3,c3+1,r3-2,c3+2);
change(map,r3-1,c3,r3-1,c3+2);
//右下角
change(map,r4,c4,r4-2,c4-1);
change(map,r4,c4-1,r4-2,c4-2);
change(map,r4-1,c4,r4-1,c4-2);
}
for (int i=1; i<=l; i++) {
for (int j=1; j<=l; j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}
private static void change(char[][] ch, int x1, int y1, int x2, int y2) {
char t;
t = ch[x1][y1];
ch[x1][y1] = ch[x2][y2];
ch[x2][y2] = t;
}
}
还没有评论,来说两句吧...