欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

wikioi 1160 蛇形矩阵

发布时间:2025/3/21 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 wikioi 1160 蛇形矩阵 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
/*======================================================================== 1160 蛇形矩阵 题目描述 Description小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和. 输入描述 Input Descriptionn(即n行n列) 输出描述 Output Descriptionn+1行,n行为组成的矩阵,最后一行为对角线数字之和 样例输入 Sample Input3 样例输出 Sample Output5 4 36 1 27 8 925 数据范围及提示 Data Size & Hint ==========================================================================*/

解析:

下面是n等于7和n等于5的时候数组的样子:

   

填充数组的方式 如下:

先手动填充数字1(其位置为(n/2,n/2),如上图所示。)
然后一层一层地填充其余部分的数据。(层数m=n/2)
对每一层的填充,按如下顺序处理:

先填充右边这一列(这一列最底下的数据先不填充,下同。)

接着填充上边的横行,然后填充左边这一列,最后填充下边的横行。

(每一段的填充范围如图颜色所示。)

 

对第x层(1<=x<=m),填充某一段时,该段数据个数为2*x。

比如n=5,第一层每一段的个数是2,第二层每一段的个数是4.

n=7时,第三层每一段的个数是6.

……所以,每一段的循环次数k=2*x。

下面的代码对这一点的处理稍微不同,但本质一样。下面的k从2开始,k/2要小于或等于m即可。

(段与段之间要注意修改坐标)

下面是代码:

#include<stdio.h> int main() {int i,j,n,a[100][100],k,m,t,p,sum=0;scanf("%d",&n);i=j=n/2;//最内层的1所在的位置 m=n/2;//循环填充的层数(不包括最内层的1) a[i][i]=1;t=2;//准备放进数组的数据for(k=2;k/2<=m;k=k+2) {j=j+1;for(p=1;p<=k;p++)//填充右侧这一列{a[i][j]=t;t++;i--;}i++;j--;for(p=1;p<=k;p++)//填充上边这一横行{a[i][j]=t;t++;j--;}j++;i++;for(p=1;p<=k;p++)//填充左边这一列{a[i][j]=t;t++;i++;}i--;j++;for(p=1;p<=k;p++)//填充下面这一横行{a[i][j]=t;t++;j++;}j--;}for(i=0;i<n;i++)//输出数组顺便求对角线元素的和{for(j=0;j<n;j++){printf("%5d ",a[i][j]);if(i==j||i+j==n-1) sum=sum+a[i][j];}printf("\n");}printf("%d\n",sum);return 0; }

 

转载于:https://www.cnblogs.com/huashanqingzhu/p/3458514.html

总结

以上是生活随笔为你收集整理的wikioi 1160 蛇形矩阵的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。