201412-2 Z字形扫描

在这里插入图片描述
解题思路:
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值