題目
問題描述在影象編碼的演算法中,需要將乙個給定的方形矩陣進行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迴圈,實現不了目標。
題解
#includeusingnamespace
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的函式不能用,但也正是不能用,對於早期的人...