ccf Z字形掃描
阿新 • • 發佈:2018-12-31
問題描述
在影象編碼的演算法中,需要將一個給定的方形矩陣進行Z字形掃描(Zigzag Scan)。給定一個n×n的矩陣,Z字形掃描的過程如下圖所示:
對於下面的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 評測用例規模與約定
對於下面的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> #include <cstdio> #include <cstring> using namespace std; struct pos{ int x, y; }; const int size = 501; int array[size][size] = {0}; inline void print_pos(pos &p) { cout << " " << array[p.y][p.x]; } inline bool judge(pos &p, int n) { return (p.x >n || p.y > n); } int main() { int n; cin >> n; for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) cin >> array[i][j]; pos start = {1, 1}; cout << array[1][1]; while (true) { // 現在要做的是模擬z字形的路徑 // 先橫向,如果到達邊界,則向下 pos next; if (start.x == n) { next.y = start.y + 1; next.x = start.x; } else { next.y = start.y; next.x = start.x + 1; } if (judge(next, n)) break; print_pos(next); // 然後是向左下斜向前進 while (next.x > 1 && next.y < n) { next.x = next.x - 1; next.y = next.y + 1; print_pos(next); } //然後是向下前進,如果到達邊界,則向右前進 if (next.y == n) next.x += 1; else next.y += 1; //next.x = next.x; if (judge(next, n)) break; print_pos(next); // 然後是斜向右上方前進 while (next.x < n && next.y > 1) { next.x += 1; next.y -= 1; print_pos(next); } // 一次模擬完成了,然後要做的是迴圈即可 start = next; } printf("\n"); return 0; }