codevs 1160 蛇形矩阵x
题目描述 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
分类标签 Tags 点此展开
一定要注意 :这道题一开始走的方向是 fx=1 ;
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 6 using namespace std; 7 8 int n,lastnum,sum,num=1; 9 int jz[101][101]; 10 int fx;//代表此时走的方向 11 12 void con(int nx,int ny) 13 { 14 fx=1; 15 memset(jz,0,sizeof(jz)); 16 jz[nx][ny]=1; 17 while(num<lastnum) 18 { 19 if(fx==0)//向右走 20 { 21 nx++; 22 jz[nx][ny]=++num; 23 if(jz[nx][ny+1]==0) 24 { 25 fx=1;//转变为向上走 26 } 27 } 28 else if(fx==1)//向上走 29 { 30 ny++; 31 jz[nx][ny]=++num; 32 if(jz[nx-1][ny]==0) 33 { 34 fx=2;//转变为向左走 35 } 36 } 37 else if(fx==2)//向左走 38 { 39 nx--; 40 jz[nx][ny]=++num; 41 if(jz[nx][ny-1]==0) 42 { 43 fx=3;//转变为向下走 44 } 45 } 46 else if(fx==3)//向下走 47 { 48 ny--; 49 jz[nx][ny]=++num; 50 if(jz[nx+1][ny]==0) 51 { 52 fx=0;//转变为向右走 53 } 54 } 55 } 56 } 57 58 int main() 59 { 60 scanf("%d",&n); 61 lastnum=n*n; 62 int firstx=(n+1)/2;//因为n一定为奇数 63 int firsty=firstx; 64 con(firstx,firsty); 65 for(int i=1;i<=n;i++) 66 { 67 for(int j=1;j<=n;j++) 68 { 69 cout<<jz[i][j]<<" "; 70 } 71 cout<<endl; 72 } 73 for(int i=1;i<=n;i++) 74 { 75 for(int j=1;j<=n;j++) 76 { 77 if(i==j) sum+=jz[i][j];//位于对角线上点 点的特征 78 if(i+j==n) sum+=jz[i][j]; 79 } 80 } 81 cout<<sum; 82 return 0; 83 }