#include <iostream>
using namespace std;
int a[1000][1000];
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>a[i][j];
int x,y;
x=0;
y=0;
int flag=1,flag2=1;
cout<<a[y][x]<<" ";
x++;
int num=1,c=0;
for(int index=0; index<n*n-1; index++)
{
//cout<<y<<" "<<x<<" "<<a[y][x]<<endl;
cout<<a[y][x]<<" ";
if(c==num)//转向
{
if(flag==1&&num!=n-1)
{
y+=flag; // cout<<a[y][x]<<" ";
}
else if(flag==-1&&num!=n-1)
{
x-=flag; //cout<<a[y][x]<<" ";
}
c=0;
flag*=-1;
if(num==n-1)
{
flag*=-1;
if(flag==1)
x+=flag;
else
y-=flag;
flag2*=-1;
}
num+=flag2;
// cout<<num;
continue;
}
if(flag2==1)
{
x-=flag;
y+=flag;
}
else
{
x+=flag;
y-=flag;
}
c++;
}
return 0;
}
思路:每条路线长度由1累加到最大,最大不会超过n,达到n后递减,以此作为判定转向的依据。同时需要注意,达到最大路线长度时,拐角处不会转向