https://ac.nowcoder.com/acm/contest/19306/1026

蛇形矩阵

#include <bits/stdc++.h>
using namespace std;
typedef long long  ll;
const ll N=1e6+10;

int main()
{
    ll m,n; //m行n列的蛇形矩阵
    cin>>m;
    n=m;
    ll dx[] = {0,1,0,-1};	
    ll dy[] = {1,0,-1,0};  //dx和dy数组用于调整方向
    ll g[110][110] = {0}; //初始化数组元素全为0   
    ll x = 0,y = 0,d = 0;    
    for(ll i = 1;i <= m*n;i ++) {
    
        g[x][y] = i; 
        ll a = x + dx[d]; //开始时先向右移,所以从d=1开始
        ll b = y + dy[d];  //a和b记录要移动到的位置
        if(a < 0 || a >= m || b < 0 || b >= n || g[a][b]) //边界处理,如果满足这四种条件中的一种,即越界,需要改变方向。
        {
            d = (d + 1) % 4; //顺时针改变方向操作
            a = x + dx[d]; 
            b = y + dy[d];
        }
        x = a;
        y = b;
    }
    for(ll i = 0;i < m;i ++)  //输出蛇形矩阵
    {  
        for(ll j = 0;j < n;j ++)
            cout<<g[i][j]<<" ";
        cout<<endl;
    }
    
    return 0;
}

https://ac.nowcoder.com/acm/contest/19306/1027

z型矩阵

alt

#include <bits/stdc++.h>
using namespace std;
typedef long long  ll;
const ll N=1e3+10;
ll a[N][N];
int main() {
    ll n;
    cin>>n;
    ll cnt=1;
    ll i=1,j=1;
    ll idx=0;
    while(cnt<=n*n) {
        while(idx==0&&i>=1&&i<=n&&j>=1&&j<=n) 
            a[i--][j++]=cnt++;
        while(idx==1&&i>=1&&i<=n&&j>=1&&j<=n) 
            a[i++][j--]=cnt++;
        if(idx==0) { //up
            //down
            if(i+j<=n) i++;
            else i+=2,j--;
        }
        if(idx==1) { //down
            //up
            if(i+j<=n) j++;
            else j+=2,i--;
        }
        idx=!idx;
    }
    
    for(ll i=1;i<=n;i++) {
        for(ll j=1;j<=n;j++) {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}