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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章