历届试题 打印十字图

蓝桥杯历届试题

	## 打印十字图
  • 此题说白了就是个规律题,第一眼看到的各位朋友应该耐心的看完
  • n==3时的图形
我对此题的规律总结如下:
*  首先用二维数组来保存图形,并初始化为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;
	}
}
  • 注意蓝桥杯的提交,类名为main,不需要包名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值