1. 程式人生 > >CCF-Z字形掃描 (Python) (90分,求大佬指正)

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分呢?哪位大佬可以幫我看看嗎?