1. 程式人生 > >【CCF】Z字形掃描

【CCF】Z字形掃描

txt color body math 編碼 div 表示 LG 元素

問題描述   在圖像編碼的算法中,需要將一個給定的方形矩陣進行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 評測用例規模與約定   1≤n≤500,矩陣元素為不超過1000的正整數。 分析
四種選擇:右,右上,下,左下
 1 #include <iostream>
 2 #include <iomanip>
 3 #include <cstdio>
 4 #include <string.h>
 5 #include <cstring>
 6 #include <algorithm>
 7 #include <cmath>
 8 #include <string>
 9 #include <queue>
10 #include <map>
11 #include <vector>
12
#include <set> 13 #include <list> 14 using namespace std; 15 typedef long long ll; 16 const int INF = 0x3f3f3f3f; 17 const int NINF = 0xc0c0c0c0; 18 const int maxn = 505; 19 int MonthDay[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 20 string MonthName[] = {"Jan","Jan","Feb","Mar","Apr","
May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; 21 string DayName[] = {"Sun", "Mon","Tue","Wed","Thu","Fri","Sat"}; 22 int s[maxn][maxn]; 23 24 int main() { 25 freopen("/Users/kangyutong/Desktop/in.txt","r",stdin); 26 // freopen("/Users/kangyutong/Desktop/out.txt","w", stdout); 27 int n; 28 cin >> n; 29 for(int i = 0; i < n; i++) { 30 for(int j = 0; j < n; j++){ 31 cin >> s[i][j]; 32 } 33 } 34 int r = 0, c = 0; 35 int choice = 1; 36 while(r != n-1 || c != n-1) { 37 cout << s[r][c] << " "; 38 if(choice == 1) {//right 39 c++; 40 if(r == 0) choice = 4;//leftdown 41 else choice = 2; //rightup 42 } 43 else if(choice == 2) {//rightup 44 r--; 45 c++; 46 if(r == 0 && c != n-1) choice = 1;//down 47 else if(c == n-1) choice = 3;//down 48 49 } 50 else if(choice == 3) {//down 51 r++; 52 if(c == 0) choice = 2;//rightup 53 else choice = 4;//leftdown 54 } 55 else if(choice == 4) {//leftdown 56 r++; 57 c--; 58 if(r != n-1 && c == 0) choice = 3;//down 59 else if(r == n-1) choice = 1; //right 60 } 61 } 62 cout << s[n-1][n-1] << endl; 63 return 0; 64 }

【CCF】Z字形掃描