解题思路:
n<=500,开一个横纵不小于1000的二维矩阵保存矩阵(n的二倍)
以横纵长度为5的矩阵为例子:我们把一个矩阵按照横纵坐标的和从2到10分为9个斜行,然后对一个斜行一个斜行的开始遍历,遍历一个斜行的过程中,横纵坐标和是不变的,第一次从这一斜行的第一列那个元素开始,第二次从当前斜行的第一行那个元素开始以此类推交替进行,需要注意的是:
当遍历到对角线以下的元素时候,会出现越界的情况,即x>n或y>n,所以在初始化的时候需要将二维数组初始化为全-1,输出的时候需要先判断是不是-1再输出
#include<bits/stdc++.h>
using namespace std;
int mp[1010][1010];//这里开的长宽至少得是数据规模的二倍
int main(void)
{
int n;
cin>>n;
memset(mp,-1,sizeof(mp));//初始化为全-1
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>mp[i][j];
}
}
int flg=0;
for(int i=2;i<2*n;i++)//一斜行一斜行的遍历
{
for(int j=1;j<i&&j<=n;j++)//注意边界处理
{
if(flg==0)
{
if(mp[i-j][j]!=-1)//判断是不是越界的元素
{
cout<<mp[i-j][j]<<" ";
}
}
else
{
if(mp[j][i-j]!=-1)
{
cout<<mp[j][i-j]<<" ";
}
}
}
flg=!flg;//flg决定了每次是从这一斜行的第一列开始还是第一行开始,
//每次遍历后都要修改
}
cout<<mp[n][n]<<endl;//右下角的元素输出的时候需要加换行特殊处理
return 0;
}