AcWing 3208 Z字形掃描
阿新 • • 發佈:2021-03-06
題目描述:
在影象編碼的演算法中,需要將一個給定的方形矩陣進行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 字形掃描後的結果。
資料範圍
1≤n≤500,
矩陣元素為不超過1000 的正整數。
輸入樣例:
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
#include <iostream> #include <cstdio> using namespace std; const int MAX = 509; int a[MAX][MAX]; int ans[MAX * MAX]; int n; bool check(int x, int y) { if(x >= 0 && x < n && y >= 0 && y < n) return true; return false; } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) scanf("%d", &a[i][j]); } int N = n * n; int cnt = 1, k = 0; bool down = false; // down為false向右走,否則向下走 int row = 0, col = 0; bool rightup = true; // true向右上方走,false向左下方走 bool f = false; while(k < N) { for(int i = 0; i < cnt; i++) { ans[k++] = a[row][col]; // printf("(%d, %d) a = %d\n", row, col, a[row][col]); if(check(row - 1, col + 1) && rightup) { row--; col++; } if(check(row + 1, col - 1) && !rightup) { row++; col--; } } // printf("\n"); if(cnt >= n) f = true; if(!f) cnt++; else cnt--; if(!down) { if(check(row, col + 1)) // 可以向右走 { col ++; down = true; } else row++; } else { if(check(row + 1, col)) // 可以向下走 { row++; down = false; } else col++; } rightup = !rightup; } N = n * n; for(int i = 0; i < N; i++) printf("%d ", ans[i]); return 0; }