[CodeVS1160]蛇形矩阵

经历了 Day3 的挫折,不由得想起了曾近屡交屡 WA 的蛇形矩阵(毕竟当时太弱)。为了挺过难关,重拾信心,便重新审视了一下题…

题目描述 Description

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

输入描述 Input Description

n(即n行n列)

输出描述 Output Description

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

自己的分析 My Opinion

利用左上角的点为 (n-1)^2 的特性进行模拟移动。

#include "cmath"
#include "cstring"
#include "cstdlib"
#include "cstdio"
#include "iostream"
#include "algorithm"
#define rep(i,l,r) for(i = l;i < r; i++)
#define derep(i,l,r) for(i = l;i > r; i--)
#define N 100
int arr[N][N];
int i,j,n,k = 0,t,margin = 0;
using namespace std;
void Init()
{
    scanf("%d", &n);
    memset(arr,0,sizeof(arr));
}

void Print()
{
    rep(i,0,n)
    {
        rep(j,0,n)
        printf("%d  ", arr[j][i]);
        printf("\n");
    }   
}

void Solve()
{
    arr[(n-1)/2][(n-1)/2]=1;
    int n1 = n;
    while(margin < (n-1)/2)
    {
        //left top
        arr[0+margin][0+margin] = pow((n1-1-margin),2)+1;
        //top
        rep(i,1+margin,n-margin)
            arr[i][0+margin] = arr[i-1][0+margin]-1;
        //left
        rep(i,1+margin,n-margin)
            arr[0+margin][i] = arr[0+margin][i-1]+1;
        //bottom
        rep(i,1+margin,n-margin)
            arr[i][n-1-margin] = arr[i-1][n-1-margin]+1;
        //right
        rep(i,1+margin,n-1-margin)
            arr[n-1-margin][i] = arr[n-1-margin][i-1]-1;
        margin++;
        n1 = n1 - 1;
    }
}

void Diagonal_line()
{
    int sum = -1;
    rep(i,0,n)
        sum+=arr[i][i];
    derep(i,n-1,-1)
        sum+=arr[n-i-1][i];
    printf("%d", sum);
}

int main()
{
    Init();
    Solve();
    Print();
    Diagonal_line();
    return 0;
}

CC BY-SA 4.0 [CodeVS1160]蛇形矩阵 by 小小泥娃的部落格 is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

发表评论