ccf141202 Z字形掃瞄

2022-05-21 16:06:12 字數 1924 閱讀 8959

題目

問題描述

在影象編碼的演算法中,需要將乙個給定的方形矩陣進行z字形掃瞄(zigzag scan)。給定乙個n×n的矩陣,z字形掃瞄的過程如下圖所示:

對於下面的4×4的矩陣,  1

5393

7569

4647

313對其進行z字形掃瞄後得到長度為16的序列:  1

5397

3954

7366

413請實現乙個z字形掃瞄的程式,給定乙個n×n的矩陣,輸出對這個矩陣進行z字形掃瞄的結果。輸入格式輸入的第一行包含乙個整數n,表示矩陣的大小。

輸入的第二行到第n+1行每行包含n個正整數,由空格分隔,表示給定的矩陣。輸出格式輸出一行,包含n×n個整數,由空格分隔,表示輸入的矩陣經過z字形掃瞄後的結果。樣例輸入415

3937

5694

6473

13樣例輸出

153

9739

5473

6641

3評測用例規模與約定1≤n≤500,矩陣元素為不超過1000的正整數。

(就不貼圖了)

思路

1.主要就是判斷到了邊界上的時候怎麼走,比如如果現在位置為(i,j),可以繼續往下走(i!=n-1),那麼位置變成(i+1,j);如果不可以往下走,也就是走到了下邊界上了,那麼只能向右走,那麼位置變成(i,j+1)。處理右邊界同理。

2.判斷完邊界後,主要就是中間值要怎麼控制輸出的問題了。本來發現了斜線相連的幾個相鄰點上的i+j之和是一樣的,然後覺得也許需要用到這個條件來控制輸出。想了一下,這樣對於同一條斜邊上的輸出順序會不會有點難控制,畢竟有的是斜向上,有的是斜向下。但其實也應該是可行的,只不過有點拗。

3.現在選用的是看了乙個博主的解法,給我的啟示。因為這個z字形走的順序是固定的,其實是分為四個階段就是乙個輪迴(從上邊界上的點(0,j)回到上邊界的點(0,j+2))。首先是向右,然後斜向左下方,再向下,最後斜向右上方。所以寫乙個迴圈,分別把這四個過程都描述清楚,然後依次輸出即可。

4.這個題目過程碰到的問題主要就是:本來是想把沿著邊界變換後的位置輸出,放在兩個迴圈外面,就是完完整整的四個階段,每個階段有各自的輸出。但是這樣的話如果n=1,就會多出兩個在外面的輸出(第一二階段,因為一二階段本來是設定不需要判斷的直接輸出);其次就是捋順i和j的變換,多加了就要多減;最後就是判斷結束的條件,我很不習慣這樣的寫法,所以每次需要同時判斷i和j 的時候總是寫成雙重for迴圈,實現不了目標。

題解

#includeusing

namespace

std;

#define max 501

intmatrix[max][max];

intmain()

}int i=0

;

int j=0

; printf(

"%d

",matrix[i][j]);

while(i2*(n-1

))

else

while(j>=0 && i<=n-1

)

else

i++;

j--;

}i--;

j++;

if(i==n-1

)

else

while(j<=n-1 && i>=0

)

else

i--;

j++;

}i++;

j--;

}return0;

}

CCF 201412 2 Z字形掃瞄

ccf 201412 2 z字形掃瞄 第一次的思路做錯了嚶.1 include2 include3 using namespace std 4int arr 505 505 5 bool visit 505 505 6 const int dr 右0,左下1,下2,右上3 32 將每次回到第一行或最...

CCF認證刷題 201412 2 Z字形掃瞄

這道題的難點主要是控制邊界,觀察題目給的路徑可以看出,有兩個掃瞄的方向,斜向上與斜向下,我這裡用enu menum enum 型別變數儲存方向,初始點為 0,0 0,0 0,0 方向為斜向上,先列印出訪問的點,再嘗試著根據當前掃瞄的方向前進,後面4 44個條件判斷語句分別控制掃瞄出錯及改正的策略。d...

CCF認證201909 3字元畫

201909 3字元畫 吐槽一下 題目極其複雜,做的時候看了十幾分鐘題目愣是沒看懂,去網上看了其他同學做的一些blog,還是沒看懂。然後對著感謝鏈結裡的同學的 梳理了一下,才明白題目要幹嘛,由於個人原因,只能在visual c 6.0裡操作,所以很多c 11的函式不能用,但也正是不能用,對於早期的人...