(水题)蛇形矩阵

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 }
View Code

 

你可能感兴趣的:(水题)