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
第二部分:思路
思路:从中心位置开始,以逆时针方向“行走”,改变方向的条件是:当前位置的下一方向上没有走过,利用初始化数组为0,来判断,如果为0说明没有走过。
其次需要稍微注意的是:在计算对角线上数字和的时候,因为中心位置的数字加了两次,所以要减去一个中心位置数字,也就是1。
第三部分:代码
#include<stdio.h> int main() { int n,i,j,dir=1,s[100][100]={0},sum=0;//dir表示方向,有1,2,3,4四个值,分别表示右、上、左,下 scanf("%d",&n); //中间位置 i=n/2; j=i; s[i][j]=sum++; //sum 表示当前所要填写的数字,中间位置肯定为1 //因为螺旋方向是逆时针,即:右->上->左->下,循环。 //需要注意的是:方向改变的条件是下一方向上的位置没有走过,那么怎么判断呢? //利用初始化为0,只要不为0说明走过了。 while(sum<=n*n) { switch(dir) { case 1://向右走 { s[i][j++]=sum++; if(s[i-1][j]==0) { dir=2; } break; } case 2://向上走 { s[i--][j]=sum++; if(s[i][j-1]==0) { dir=3; } break; } case 3://向左走 { s[i][j--]=sum++; if(s[i+1][j]==0) { dir=4; } break; } default://向下走 { s[i++][j]=sum++; if(s[i][j+1]==0) { dir=1; } break; } } } sum=0; //左上角到右下角和 i=0; while(i<n) { sum+=s[i][i]; i++; } //左下角到右上角和 i=n-1; j=0; while(i>=0) { sum+=s[i][j]; i--; j++; } //去掉一次对角线中相交处即中心数字。 sum-=s[n/2][n/2]; for(i=0;i<n;i++) { for(j=0;j<n-1;j++) { printf("%d ",s[i][j]); } printf("%d\n",s[i][j]); } printf("%d\n",sum); return 0; }
害怕失败的人,已经是一个loser!