codevs 1160 蛇形矩阵

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

数据范围及提示 Data Size & Hint
 
奉上代码:
 
#include<bits/stdc++.h>

#define N 100005
#define ll long long
#define RE register
#define max(a,b) (a>b?a:b)

using namespace std;

void read(int &x){
    int flg=1;x=0;RE char ch=getchar();
    if(ch=='-') flg=-1;
    for(;ch>'9'||ch<'0';) ch=getchar();
    for(;ch<='9'&&ch>='0';ch=getchar()) x=x*10+ch-'0';
    x*=flg;
}
int n,a[105][105],tp,t,x,y,ans,k;
int mx[4]={0,-1,0,1},
    my[4]={1,0,-1,0};
int main()
{
    read(n);
    k=tp=1;x=n/2+1;y=n/2+1;a[x][y]=tp;
    while(1){
        for(int i=1;i<=tp;i++){
            x+=mx[t];y+=my[t];
            a[x][y]=++k;
        }++t;
        if(t==2||t==4) tp+=1;
        if(t==4) t=0;
        if(x==n&&y==n+1) break;
    }for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            printf("%d ",a[i][j]);
            if(i==j||i+j==n+1) ans+=a[i][j];
        }printf("
");
    }printf("%d",ans);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/song-/p/8834923.html