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("\n");
    }printf("%d",ans);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/song-/p/8834923.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值