CCFZ字形扫描

题目

CCFZ字形扫描

思想

CCFZ字形扫描

规律

首先通过画图我们可以看出一些规律

  1. 每一对角线行(下面简称行)上的点的横纵坐标之和为定值,就比如(1,1)所在的行的 行号i为2(此处用横纵坐标之和作为行号),当我们知道一个点的横坐标j的时候的时候就可以求出纵坐标i-j.
  2. 通过对行号的观察可以发现当行号为偶数的时候都是从向右上去遍历,当行号为奇数的时候都是向左下去遍历

思想

为了将规则进行简化并且统一,我们将遍历的范围进行扩大
CCFZ字形扫描
在扩大之后遍历规则就变为了

  1. 行号为偶数时向右上遍历,此时纵坐标j可以从1开始向右上去遍历,此时的横坐标为 i-j。比如在遍历行号为i=4的行时,j=1 即从(3,1)点开始向左上遍历遍历到j<i(因为坐标是从1开始的,所以单一坐标都不可以超过i)
  2. 行号为偶数时向左下遍历,此时纵坐标j可以从j=i-1开始向左下去遍历,此时的横坐标为 i-j,遍历终止条件为j==0时停止。

代码

#include<iostream>
#include<stdio.h>
using namespace std;
const int N=510;
int arr[N][N];
int n;
int main(){
    cin>>n;
    
    //输入
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%d",&arr[i][j]);
        }   
    }
    //遍历
    for(int i=2;i<=2*n;i++){
        //当坐标之和为偶数时,应该从下往上扫描
        if(i%2){
            for(int j=1;j<i;j++){
                if(j>=1&&j<=n && i-j>=1&&i-j<=n){
                    printf("%d ",arr[j][i-j]);
                }
            }
        }
        //当坐标之和为奇数时,应该从上往下扫描
        else{
            for(int j=i-1;j>0;j--){
                if(j>=1&&j<=n && i-j>=1&&i-j<=n){
                    printf("%d ",arr[j][i-j]);
                }
            }
        }
        
    }
    return 0;
}

后记

此题思路我是从y总的视频中学会的,如果还没懂的同学,建议直接看y总视频视频出处y总YYDS。

上一篇:【算法】归并排序


下一篇:4.从legacy或concurrent开始(从入口开始,然后让我们奔向未来)