题解:B4199 [常州市赛 2020] 旋转数塔

· · 题解

看螺旋方阵前记得把蛇形方阵做了。

题目大意:

请你用 1n \times n 之间的整数,依次填充一个 n \times n 的方阵。由题目中给出的两张模板方阵得知,我们需要从外到内顺序填入数字。

将第 2 幅图简单整理得出的 规律模板 : 不同颜色代表每轮循环的目的。大家看蓝色部分,当已经填入了 n \times n 个数时要及时停止,意味着每填入一个数都要进行判断。

Code:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[55][55],x=1,y,k;
int main(){
    //可自行添加快读。
    cin>>n;
    m=n;
    while(k<n*n){//按照规律进行填充即可。
        while(y<m && k<n*n)a[x][++y]=++k;
        while(x<m && k<n*n)a[++x][y]=++k;
        while(y>n-m+1 && k<n*n)a[x][--y]=++k;
        while(x>n-m+2 && k<n*n)a[--x][y]=++k;
        if(k<n*n)a[x][++y]=++k;
        while(x<m-1 && k<n*n)a[++x][y]=++k;
        while(y<m-1 && k<n*n)a[x][++y]=++k;
        while(x>n-m+2 && k<n*n)a[--x][y]=++k;
        while(y>n-m+3 && k<n*n)a[x][--y]=++k;
        if(k<n*n)a[++x][y]=++k;
        m-=2;//本次循环填了2层。
    }for(int i=1;i<=n;i++){//输出方阵。
        for(int j=1;j<=n;j++){
            cout<<a[i][j]<<" ";
        }
        cout<<"\n";
    }
    return 0;//好习惯。
}