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型矩阵
#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;
}