C语言一菜鸟级


私信TA

用户名:LHL

访问量:63263

签 名:

AC总是意料之外 ^_^

等  级
排  名 47
经  验 11175
参赛次数 5
文章发表 56
年  龄 24
在职情况 在职
学  校 四川工商学院
专  业 通信工程

  自我简介:

C语言 蓝桥杯 ACM 新人 欢迎大佬 前来指导 交流 本人 博客https://fivecc.blog.csdn.net/

解题思路:

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


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


     

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;
}





 

0.0分

23 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

看不懂
2023-10-29 19:00:21
厉害这是我看到过的最简洁的题解
2023-10-17 18:39:06
棒棒哒
2022-06-29 15:35:55
题主完全可以申请优质题解啊,代码是真的好啊。
2021-01-14 09:17:35
厉害,一层铺一层
2019-12-19 20:29:16
怎么看出是正方形的
2019-11-03 18:21:35
2019-05-31 10:49:15
牛逼!!
2019-04-25 17:52:05