分析
模拟过程
注意n为奇数、偶数时的z字形走向
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 510;
int n,a[N][N],ans[N*N],idx;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++) scanf("%d",&a[i][j]);
}
int x,y;
for(int i=0;i<n;i++)
{
if(i%2)
{
x=0,y=i;
while(y>-1)
{
ans[idx++]=a[x][y];
x++,y--;
}
}
else{
x=i,y=0;
while(x>-1)
{
ans[idx++]=a[x][y];
x--,y++;
}
}
}
if(x<0) //n为奇数,z从上到下
{
for(int i=1;i<n;i++)
{
if(i%2)
{
x=i,y=n-1;
while(x<n)
{
ans[idx++]=a[x][y];
x++,y--;
}
}
else{
x=n-1,y=i;
while(y<n)
{
ans[idx++]=a[x][y];
x--,y++;
}
}
}
}
else{ //n为偶数,z从下到上
for(int i=1;i<n;i++)
{
if(i%2)
{
x=n-1,y=i;
while(y<n)
{
ans[idx++]=a[x][y];
x--,y++;
}
}
else{
x=i,y=n-1;
while(x<n)
{
ans[idx++]=a[x][y];
x++,y--;
}
}
}
}
for(int i=0;i<idx;i++) printf("%d ",ans[i]);
return 0;
}