CCF 201412-2 Z字形掃描

原文地址: http://moilk.org/blog/2016/09/05/ccf2014122/

問題描述
  在圖像編碼的算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n的矩陣,Z字形掃描的過程如下圖所示:
  zig
  對於下面的4×4的矩陣,
  1 5 3 9
  3 7 5 6
  9 4 6 4
  7 3 1 3
  對其進行Z字形掃描後得到長度爲16的序列:
  1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
  請實現一個Z字形掃描的程序,給定一個n×n的矩陣,輸出對這個矩陣進行Z字形掃描的結果。
輸入格式
  輸入的第一行包含一個整數n,表示矩陣的大小。
  輸入的第二行到第n+1行每行包含n個正整數,由空格分隔,表示給定的矩陣。
輸出格式
  輸出一行,包含n×n個整數,由空格分隔,表示輸入的矩陣經過Z字形掃描後的結果。
樣例輸入
  4
  1 5 3 9
  3 7 5 6
  9 4 6 4
  7 3 1 3
樣例輸出
  1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
評測用例規模與約定
  1≤n≤500,矩陣元素爲不超過1000的正整數。

#include <iostream>

using namespace std;

int vec[500][500];
enum DIR {
    RIGHT_UP,RIGHT,LEFT_DOWN,DOWN
};

int main(void) {
    int N;
    cin>>N;
    for(int i=0; i<N; i++) {
        for(int j=0; j<N; j++) {
            cin>>vec[i][j];
        }
    }
    int i=0,j=0;
    int dir=RIGHT;
    bool ok=true;
    while(1) {
        cout<<vec[i][j]<<' ';
        if(i==N-1&&j==N-1) {
            break;
        }
        ok=false;
        switch(dir) {
            case RIGHT_UP:
                if(j+1==N) {
                    i++;
                    dir=LEFT_DOWN;
                } else if(i-1==-1) {
                    j++;
                    dir=LEFT_DOWN;
                } else {
                    i--;
                    j++;
                }
                break;
            case RIGHT:
                if(j+1==N) {
                    i++;
                    dir=LEFT_DOWN;
                } else {
                    j++;
                    if(i==0) {
                        dir=LEFT_DOWN;
                    } else {
                        dir=RIGHT_UP;
                    }
                }
                break;
            case LEFT_DOWN:
                if(i+1==N) {
                    j++;
                    dir=RIGHT_UP;
                } else if(j-1==-1) {
                    i++;
                    dir=RIGHT_UP;
                } else {
                    i++;
                    j--;
                }
                break;
            case DOWN:
                if(i+1==N) {
                    j++;
                    dir=RIGHT_UP;
                } else {
                    i++;
                    if(j==0){
                        dir=RIGHT_UP;
                    }else{
                        dir=LEFT_DOWN;
                    }
                }
                break;
        }
    }
    cout<<endl;

    return 0;
}
發佈了38 篇原創文章 · 獲贊 28 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章