蓝桥杯打印十字图

问题描述

小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。

输入格式

一个正整数 n (n<30) 表示要求打印图形的层数。

输出格式

对应包围层数的该标志。

样例输入1

1

样例输出1

..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..

样例输入2

3

样例输出2

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

提示

请仔细观察样例,尤其要注意句点的数量和输出位置。

以上是原题。

解题思路:将图形分割,找出其中规律。并利用二维数组存放图形

规律是

.

. .

$$$             //从这里往下前面都加了$ .

$ . . . .

$ . $ $ $

 

中间部分

         $

       . $ .

     $ . . . $   //规律是从第二行开始两边是点中间都是$ 

  . $ $ $ $ $ .   //相反亦然,数量是每层+4个

然后对打印出来部分的进行反转

三角上下反转然后左右反转

正三角上下翻转

最后输出二维数组

以下是代码:

import java.util.Scanner;
public class Main {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		char[][] graph=new char[5+4*n][5+4*n];
		initBorderPoint(n,graph);
		initCenterPoint(n,graph);
		for(int i=0;i<5+4*n;i++) {
			for(int j=0;j<5+4*n;j++) {
				System.out.print(graph[i][j]);
			}
			System.out.println();
		}

		in.close();
        
	}
	
	
	public static void initBorderPoint(int n,char[][] graph) {		
		graph[0][0]='.';
		graph[1][0]='.';graph[1][1]='.';
		graph[2][0]='$';graph[2][1]='$';graph[2][2]='$';		
		for(int i=0;i<2*n;i++) {  
			graph[3+i][0]='$';graph[3+i][1]='.';
			for(int j=0;j<2+i;j++) {
				graph[3+i][2+j]=graph[3+i-2][j];
			}
		}		
		
		//左上给左下
		int s=1;
        for(int i=0;i<graph.length/2;i++) {       	
        	for(int j=0;j<s;j++) {       		
        		graph[graph.length-1-i][j]=graph[i][j];
        		
        	}
        	s++;		
		}
        
        //左上给右上
        int c=1;
        for(int i=0;i<graph.length/2+1;i++) {
        	for(int j=0;j<c;j++) {
        		graph[i][graph.length-1-j]=graph[i][j];
        	}
        	c++;
        }
        
        //左下给右下
        c=1;
        for(int i=graph.length;i>graph.length/2+1;i--) {
        	for(int j=0;j<c;j++) {
        		graph[i-1][graph.length-1-j]=graph[i-1][j];
        	}
        	c++;
        }
		
		
		
	}
	
	
	
	public static void initCenterPoint(int n,char[][] graph) {
		graph[graph.length/2-1][graph.length/2]='$';
		graph[graph.length/2-2][graph.length/2-1]='.';
		graph[graph.length/2-2][graph.length/2]='$';
		graph[graph.length/2-2][graph.length/2+1]='.';
		for(int i=1;i<2*n+1;i++) {
			for(int j=0;j<2+i;j++) {
				if(i%2!=0&&j==0) {
					graph[graph.length/2-2-i][graph.length/2]='.';
				}else if(i%2==0&&j==0) {
					graph[graph.length/2-2-i][graph.length/2]='$';
				}
				if(graph[graph.length/2-2-i][graph.length/2]=='.'&&j>0&&j<2+i-1) {
					graph[graph.length/2-2-i][graph.length/2+j]='.';
					graph[graph.length/2-2-i][graph.length/2-j]='.';
				}else if(graph[graph.length/2-2-i][graph.length/2]=='$'&&j>0&&j<2+i-1) {
					graph[graph.length/2-2-i][graph.length/2+j]='$';
					graph[graph.length/2-2-i][graph.length/2-j]='$';
				}
				
				if(i%2!=0&&j==2+i-1) {
					graph[graph.length/2-2-i][graph.length/2+j]='$';
					graph[graph.length/2-2-i][graph.length/2-j]='$';
				}else if(i%2==0&&j==2+i-1) {
					graph[graph.length/2-2-i][graph.length/2+j]='.';
					graph[graph.length/2-2-i][graph.length/2-j]='.';
				}
               				
				
			}
		}
		
		for(int i=0;i<2+2*n;i++) {
			for(int j=0;j<1+i;j++) {				
				graph[graph.length/2+1+i][graph.length/2]=graph[graph.length/2-1-i][graph.length/2];		
			    if(j>=1) {
			      graph[graph.length/2+1+i][graph.length/2+j]=graph[graph.length/2-1-i][graph.length/2+j];
			      graph[graph.length/2+1+i][graph.length/2-j]=graph[graph.length/2-1-i][graph.length/2-j];
			    }
			    
			}
		}
		
			
	}

}

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值