wikioi 1160 蛇形矩阵
/*======================================================================== 1160 蛇形矩阵 题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和. 输入描述 Input Description n(即n行n列) 输出描述 Output Description n+1行,n行为组成的矩阵,最后一行为对角线数字之和 样例输入 Sample Input 3 样例输出 Sample Output 5 4 3 6 1 2 7 8 9 25 数据范围及提示 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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App