CCF认证刷题-201412-2-Z字形扫描

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E1I8fE3g-1584689560939)(/Users/idestro/Desktop/OnlineJudge/images/201412-2-Z字形扫描.png)]

分析:

​ 这道题的难点主要是控制边界,观察题目给的路径可以看出,有两个扫描的方向,斜向上与斜向下,我这里用enumenum类型变量存储方向,初始点为(0,0)(0,0),方向为斜向上,先打印出访问的点,再尝试着根据当前扫描的方向前进,后面44个条件判断语句分别控制扫描出错及改正的策略。

/*
 * @Descripttion: 
 * @version: 
 * @Author: iDestro
 * @Date: 2020-03-19 22:40:55
 * @LastEditors: iDestro
 * @LastEditTime: 2020-03-20 09:51:12
 */
#include <iostream>
using namespace std;

enum {UP, DOWN} direction;

int main() {
    int n;
    cin >> n;
    int arr[n][n];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> arr[i][j];
        }
    }
  	// cnt记录当前已经访问点的个数,i,j代表位置,默认(0,0)
    int cnt = 0, i = 0, j = 0;
  	// 方向初始为斜向上
    direction = UP;
    while (cnt++ < n*n) {
      	// 扫描到(i,j)位置并打印
        cout << arr[i][j] << " ";
      	// 尝试以当前方向前进
        if (direction == UP) {
            i--, j++;
        } else {
            i++, j--;
        }
      	// 当碰到上边界
        if (i < 0 && j > 0) {
            if (j < n) {
                i++;
            } else if (j == n) { // 在矩阵副对角线上
                i += 2;
                j--;
            }
            direction = DOWN;
            continue;
        }
      	// 当碰到做边界
        if (i > 0 && j < 0) {
            if (i < n) {
                j++;
            } else if (i == n) { // 在矩阵副对角线上
                i--;
                j += 2;
            }
            direction = UP;
            continue;
        }
      	// 当碰到右边界
        if (i >= 0 && j == n) {
            i += 2;
            j--;
            direction = DOWN;
            continue;
        }
      	// 当碰到下边界
        if (i == n && j >= 0) {
            i--;
            j += 2;
            direction = UP;
            continue;
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章