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

最新文章

  1. ASP.NET Core和Angular 2双剑合璧
  2. PLSQLDeveloper 提示不能初始化?
  3. SqlServer性能优化和工具Profiler(转)
  4. mysql 基本使用教程(源于网络)
  5. ArcGIS for Android示例解析之空间查询-----QueryTask
  6. Ubuntu 12.04 分区方案(仅供参考)
  7. iOS AFNetWorking源码详解(一)
  8. Django 数据库查询
  9. cobbler之ks文件示例
  10. crt连接vitualbox中centos虚拟机
  11. AIDL(1)
  12. redis 学习笔记——数据同步、事务
  13. textarea 空格的问题
  14. css设置文字上下居中,一行文字居中,两行或多行文字同样居中。
  15. 较为复杂的实现Parcelable的子类--推荐Android中使用
  16. Android事件处理的三种方法
  17. (转)webpack和webpack-simple区别(如何引入css文件)
  18. 定位amdu无法使用的根因并解决
  19. CentOS查看进程、杀死进程、启动进程等常用命令
  20. PHP易混淆函数的区别及用法汇总

热门文章

  1. String to Integer (atoi) ---- LeetCode 008
  2. Android屏幕适配常识
  3. Activity与Service通信(不同进程之间)
  4. Java 集合深入理解(14):Map 概述
  5. Android PermissionChecker 权限全面详细分析和解决方案
  6. PHP访问REST API上传文件的解决方案
  7. dll强签名的由来和作用
  8. Java学习第五天
  9. mysql中在表中insert数据时,有重复主键id时,变成update
  10. PostgreSQL增删数据命令示例