CCF-Z字形掃描 (Python) (90分,求大佬指正)
問題描述
試題編號: 201412-2
試題名稱: Z字形掃描
時間限制: 2.0s
記憶體限制: 256.0MB
問題描述:
問題描述
在影象編碼的演算法中,需要將一個給定的方形矩陣進行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的正整數。
問題分析:
分析這類題,首先要找出掃描的規律,從題目中可以發現,掃描是成Z字形的。那麼也就是說對於掃描輸出有四種狀態,每次輸出要判定下一次的行走路線,走一步就輸出一個。
四種狀態為{right,leftDown,down,rightUp}。
1、前提是這個矩陣是一個n維方陣,假設為Anxn.
2、從輸出當前的元素A[i][j],並根據當前的狀態來判斷下一步的掃描狀態。該如何判斷呢?可以發現每次在執行完當前狀態後,行號i或者列號j都有可能發生改變,那麼就可以結合當前狀態和行,列號的取值來判定下一步的行走路線。
從上圖中我們可以發現:
right狀態始終在首行或者尾行上執行,並且執行right狀態後列號j會增加1,即j = j+1。所以我們可以根據當前狀態的下一步狀態有兩種:
當i == 0時,state = leftDown;
當i == n-1時,state = rightUp。
執行完leftDown狀態後,i = i+1,j = j-1,其下一步狀態有三種:
當 j == 0 && i != n-1時,state = down;
當 row == n-1時,state = right;
其它情況,state = leftDown(自身狀態)。
對於rightUp和down狀態,其分析方法和上面兩種類似,就不再做分析。
Python程式碼如下:
n = int(input()) matrix = [] for i in range(n): l = list(map(int, input().split())) matrix.append(l) i = 0 j = 0 flag = "" print(matrix[i][j], end=" ") flag = "right" while True: if flag == "right": j += 1 if i == 0: flag = "left-down" if i == n - 1: flag = "right-up" if i == n - 1 and j == n - 1: print(matrix[i][j], end=" ") break print(matrix[i][j], end=" ") if flag == "down": i += 1 if j == 0: flag = "right-up" if j == n-1: flag = "left-down" print(matrix[i][j], end=" ") if flag == "left-down": i += 1 j -= 1 if j == 0 and i != n-1: flag = "down" elif i == n-1: flag = "right" else: flag = "left-down" print(matrix[i][j], end=" ") if flag == "right-up": i -= 1 j += 1 if j == n-1: flag = "down" elif i == 0 and j != n-1: flag = "right" else: flag = "right-up" print(matrix[i][j], end=" ")
我檢查了很多遍,我認為程式碼沒有錯誤呀,為什麼一直是90分呢?哪位大佬可以幫我看看嗎?