1160 蛇形矩阵
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
题目描述 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
数学太渣没推出来。。只能模拟做的。还debug好久。。。
思路就是从二维数组里最后一个数往里面转,也可以反着来。。
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #define e 1e-8 5 #include<cmath> 6 using namespace std; 7 int main() 8 { 9 int n; 10 int a[100][100]; 11 memset(a,0,sizeof(a)); 12 scanf("%d",&n); 13 int s=n*n,i=n-1,j=n-1; 14 while(s>0) 15 { 16 while(j>=0&&!a[i][j])a[i][j--]=s--; 17 j++; 18 i--; 19 while(i>=0&&!a[i][j])a[i--][j]=s--; 20 i++; 21 j++; 22 while(j<n&&!a[i][j])a[i][j++]=s--; 23 j--; 24 i++; 25 while(i<n&&!a[i][j])a[i++][j]=s--; 26 i--; 27 j--; 28 } 29 int k,l; 30 for(k=0; k<n; k++) 31 { 32 for(l=0; l<n-1; l++) 33 printf("%d ",a[k][l]); 34 printf("%d\n",a[k][l]); 35 } 36 int ans=0; 37 i=j=0; 38 for(int x=0; x<n; x++) 39 ans+=a[i++][j++]; 40 i=0;j=n-1; 41 for(int y=0;y<n;y++) 42 ans+=a[i++][j--]; 43 printf("%d\n",ans-a[n/2][n/2]); 44 return 0; 45 }
时间: 2024-10-25 17:17:43