17.蛇形矩阵(模拟)

时间限制: 1 s

 空间限制: 128000 KB

 题目等级 : 白银 Silver

题解

题目描述 Description

小明玩一个数字游戏,取个nn列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到nn列填满数字,请输出该nn列正方形矩阵以及其的对角线数字之和.

输入描述 Input Description

n(即nn列)

输出描述 Output Description

n+1行,n行为组成的矩阵,最后一行为对角线数字之和

样例输入 Sample Input

3

样例输出 Sample Output

5 4 3
6 1 2
7 8 9
25

数据范围及提示 Data Size & Hint

分类标签 Tags 点此展开 

思路:和原来的一样由外向里填数,因为n是奇数,所以从右下角开始,(偶数从左上角开始),

代码:

#include

#include

#include

using namespace std;

#define maxn 101

int a[maxn][maxn],tot=0,n,x,y;

long long sum=0;

void ts();

void sc();

int main()

{

       scanf("%d",&n);

       tot=n*n;

       x=n;y=n;

       a[n][n]=tot;//nn开始是因为输入一定是奇数

       ts();

       sc();

       return 0;

}

void sc()

{

       for(int i=1,j=1;i<=n&&j<=n;++i,++j)

       sum+=a[i][j];

       for(int i=1,j=n;i<=n&&j>=1;++i,--j)

       sum+=a[i][j];

       for(int i=1;i<=n;++i)

         {

         for(int j=1;j<=n;++j)

         printf("%-5d",a[j][i]);//五位向左对齐 ,注意输出是a[i][j]还是a[j][i]

         printf(" ");

      }

      printf("%d ",sum-1);//中间相交的那个一,不重复加

}

void ts()

{

       while(tot>1)

       {

              while(x-1>=1&&a[x-1][y]==0) a[--x][y]=--tot;//从总数开始向里面移动

              while(y-1>=1&&!a[x][y-1]) a[x][--y]=--tot;//顺序是左,上,右,下的顺序

              while(x+1<=n&&!a[x+1][y]) a[++x][y]=--tot;

              while(y+1<=n&&!a[x][y+1]) a[x][++y]=--tot;

             

       }

}

n>所在的高度储存下来

           if(a[i][2]!=0)

           h[a[i][2]]=h[i]+1;

       }

       for(int i=1;i<=n;++i)

       w[h[i]]++;//把每个高度的宽储存下来

       sort(h+1,h+n+1,cmp);//取宽度和高度最大的输出

       sort(w+1,w+n+1,cmp); 

       printf("%d %d",w[1],h[1]);

      

       return 0;

}

原文地址:https://www.cnblogs.com/csgc0131123/p/5290518.html