分情况讨论即可
#include<iostream>
using namespace std;
int a[500][500];
int n;
void dfs(int x,int y,int sta){
if(x==n-1&&y==n-1){cout<<a[x][y];return;}
cout<<a[x][y]<<" ";
if(sta==0){ //右
if(x==0)dfs(x+0,y+1,1); //在第一行,往右走,朝向改为左下角
else dfs(x+0,y+1,3); //否则,往右走,朝向改为右上角
}else if(sta==2){ //下
if(y==0)dfs(x+1,y+0,3); //在第一列,往下走,朝向改为右上角
else dfs(x+1,y+0,1); //否则,往下走,朝向改为左下角
}else if(sta==1){ //左下
int xx=x+1,yy=y-1; //下一步
if(xx==0||xx==n-1||yy==0||yy==n-1){ //达到换向点
if(xx==n-1)dfs(xx,yy,0); //最后一行,往左下走,朝向改为右
else dfs(xx,yy,2); //否则往左下走,朝向改为下
}else dfs(xx,yy,1); //继续左下
}else{ //右上
int xx=x-1,yy=y+1; //下一步
if(xx==0||xx==n-1||yy==0||yy==n-1){ //达到换向点
if(xx==0&&yy==n-1)dfs(xx,yy,2);
else if(xx==0)dfs(xx,yy,0);
else dfs(xx,yy,2);
}else dfs(xx,yy,3); //继续右上
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>a[i][j];
dfs(0,0,0);
return 0;
}