【蓝桥杯】【打印十字图】

题目

 

小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
                     $$$$$$$$$$$$$
                     $           $
                   $$$ $$$$$$$$$ $$$
                   $   $       $   $
                   $ $$$ $$$$$ $$$ $
                   $ $   $   $   $ $
                   $ $ $$$ $ $$$ $ $
                   $ $ $   $   $ $ $
                   $ $ $ $$$$$ $ $ $
                   $ $ $   $   $ $ $
                   $ $ $$$ $ $$$ $ $
                   $ $   $   $   $ $
                   $ $$$ $$$$$ $$$ $
                   $   $       $   $
                   $$$ $$$$$$$$$ $$$
                     $           $
                     $$$$$$$$$$$$$
	    对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
	    为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
	输入格式:
	一个正整数 n (n<30) 表示要求打印图形的层数
	输出:
	对应包围层数的该标志。
	例如:
	用户输入:
	1
	程序应该输出:
	..$$$$$..
	..$...$..
	$$$.$.$$$
	$...$...$
	$.$$$$$.$
	$...$...$
	$$$.$.$$$
	..$...$..
	..$$$$$..
	再例如:
	用户输入:
	3
	程序应该输出:
	..$$$$$$$$$$$$$..
	..$...........$..
	$$$.$$$$$$$$$.$$$
	$...$.......$...$
	$.$$$.$$$$$.$$$.$
	$.$...$...$...$.$
	$.$.$$$.$.$$$.$.$
	$.$.$...$...$.$.$
	$.$.$.$$$$$.$.$.$
	$.$.$...$...$.$.$
	$.$.$$$.$.$$$.$.$
	$.$...$...$...$.$
	$.$$$.$$$$$.$$$.$
	$...$.......$...$
	$$$.$$$$$$$$$.$$$
	..$...........$..
	..$$$$$$$$$$$$$..
	请仔细观察样例,尤其要注意句点的数量和输出位置。
	资源约定:
	峰值内存消耗(含虚拟机) < 64M
	CPU消耗  < 1000ms
	请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
	所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
	注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
	注意:主类的名字必须是:Main,否则按无效代码处理。

 

 

 

 

 

 

 

分析

需要将图形对应成二维数组,包围层数分别是1、2、3、4...时,

对应的二维数组规模是9x9、13x13、17x17、21x21...

可以发现公式,二维数组的规模数值 r = 9+(c-1)*4

内圈距离最外圈的距离是 2*(最外圈层数-该圈层数)

 

 

源码

 

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int cc = sc.nextInt();
		sc.close();
		
		int r = 9 + (cc-1)*4;
		char[][] a = new char[r][r];
		
//		setT(a);
		
		//画中间的十字形状
		for (int i = (r-1)/2-2; i <= (r-1)/2+2; i++) {
			a[i][(r-1)/2] = '$';
			a[(r-1)/2][i] = '$';
		}
		
//		printT(a);
		
		//一圈一圈的画出来,先画里面的圈
		for (int c = 1; c <= cc; c++) {
			//关键点,把该圈距外层的距离算出来,这是一个相对量
			int interval = 2*(cc-c);
			
			for (int i = 0+interval; i < r-interval; i++) {
				for (int j = 0+interval; j < r-interval; j++) {
					
					if(a[i][j] == '$' || a[i][j] == '.'){
						
						if(i==2+interval || i==r-3-interval){
							//第三行和倒数第三行
							if(j==2+interval || j==r-3-interval){
								a[i][j] = '$';
							}
						}
						
						continue;
					}
					
					
					if(i==0+interval || i==(r-1)-interval){
						//第一行和最后一行
						if(j>=2+interval && j<=r-3-interval){
							a[i][j] = '$';
						}else{
							a[i][j] = '.';
						}
					}
					
					if(i==1+interval || i==r-2-interval){
						//第二行和倒数第二行
						if(j==2+interval || j==r-3-interval){
							a[i][j] = '$';
						}else{
							a[i][j] = '.';
						}
					}
					
					if(i==2+interval || i==r-3-interval){
						//第三行和倒数第三行
						if(j==3+interval || j==r-4-interval){
							a[i][j] = '.';
						}else{
							a[i][j] = '$';
						}
					}
					
					if(i >2+interval && i<r-3-interval){
						//其余的行
						if(j==0+interval || j==r-1-interval){
							a[i][j] = '$';
						}else{
							a[i][j] = '.';
						}
					}
				}
			}
			
//			printT(a);
		}
		
		printT(a);
		
		
	} 
	
	private static void printT(char[][] a){
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[i].length; j++) {
				System.out.print(a[i][j]);
			}
			System.out.println();
		}
		
		System.out.println("***********************************************");
	}
	
	private static void setT(char[][] a){
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[i].length; j++) {
				a[i][j] = '#';
			}
		}
	}

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值