解题思路:

注意观察,然后通过 层次覆盖法;一层一层的叠加;从最外层(底层)开始;为达到十字效果,通过 两个行 列相反的矩阵覆盖叠加而成; 做完一个外十字 做下一个十字时 注意缩进 本题除 最外层不满足十字;其他各层'.'与'$'区域均满足十字; 下面是图例


  完成后大致是这个样子   蓝色部分代表 ‘ . ’  红色部分 代表‘ $ ’


     

QQ图片20181222152605.png




那么 我们是怎么得到的那 那么接下来 从最低层开始,最低层就是 一个矩阵,遍历一遍 就得到了 对吧。


QQ图片20181222152710.png




接下来加上一层, 又是一个矩阵 只是不过左右两边各少了两个单位,对吧 在原数组上操作,红的代表 ‘$’ ,蓝的代表‘ . ’ 。没毛病吧


QQ截图1.png


继续 再加一层,看到了吧,现在十字的最外边已经构造好了。 


QQ截图2.png


 这里还有一个 小技巧 更正一下 这个十字矩阵实际是方阵,而图形关于对角线对称。见下图 

 那么假设 A的坐标 为(i,j),  那么 B 的坐标为(j,i)对不对 交换横纵坐标,

 比如 A(1,4) 那么 B 就为(4,1)。 所以这两层可以一起操作。



QQ截图3.png


继续 还没完。 如法炮制。红的代表 ‘$’ ,蓝的代表‘ . ’ 。然后就是重复叠上去就好了



QQ截图5.png



原文     欢迎访问 我的博客



注意事项:

参考代码:

 #include<stdio.h>
 void f(int n) {
 	int i,j,t,k;  t=n+1; n=n*4+5;//根据规律算出输出矩阵实际 行 列大小 
 	char a[130][130];
 	for(i=1;i<=n;i++)//最外层 
 	for(j=1;j<=n;j++)
 	   a[i][j]='.';
 	   for(k=1;k<=t;k++) {//十字层数 K代表那一层
	 	   	for(i=1+2*k;i<=n-2*k;i++)//'$'区域十字合成 
	 	   	 for(j=1+2*k-2;j<=n-(2*k-2);j++)//左右(上下)两边少两个单位
	 	   	      a[i][j]='$',a[j][i]='$';//对称性质 
	 	   	for(i=1+2*k+1;i<=n-(2*k+1);i++)//'.'区域十字合成 
	 	   	 for(j=1+2*k-1;j<=n-(2*k-1);j++) //只比上一层缩水一个单位(仔细观察) 
	 	   	     a[i][j]='.', a[j][i]='.'; //对称性质 
		}
 	   for(i=1;i<=n;i++) {//打印十字图像 
 	   	for(j=1;j<=n;j++)printf("%c",a[i][j]);
 	         printf("\n");
		}
 }
int main(){
    int n;
      scanf("%d",&n);
   f(n);
 return 0;
}





点赞(28)
 

0.0分

20 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 10 条评论

水无月 1年前 回复TA
看不懂
Morningstar 1年前 回复TA
厉害这是我看到过的最简洁的题解
峰峰 2年前 回复TA
棒棒哒
黑暗中的冷芒 4年前 回复TA
题主完全可以申请优质题解啊,代码是真的好啊。
  一起闹〆朱瑞晗 4年前 回复TA
@周大象 数的
找不着能用的 5年前 回复TA
厉害,一层铺一层
周大象 5年前 回复TA
怎么看出是正方形的
一叶知秋 5年前 回复TA
望尽天涯路 5年前 回复TA
牛逼!!
猥琐大叔 5年前 回复TA
很赞