1. 程式人生 > >某比賽小記5- 螺旋遍歷矩陣

某比賽小記5- 螺旋遍歷矩陣

題目:給定一個二維矩陣,從[0][0]開始向右,按順時針遍歷全部資料,比如[[a,b][c,d]],遍歷順序就是a,b,d,c。最後將遍歷的元素用逗號連線,列印整個遍歷結果。給定二維矩陣見檔案。

題解:本題思路很容易設計,就是每次訪問越界或者是訪問到已經訪問的元素就向右轉向,當右邊沒有路了則結束。難點主要是邊界條件的處理。

python版本:

m = [給定矩陣]
#利用numpy構造二維全0陣列
# tagnp = np.zeros(32*32)
# tagnp = tagnp.reshape(32,32)
# tagnp = tagnp.astype(int)
# tag = tagnp.tolist()
#直接構造二維全零陣列
tag = [[0 for i in range(32)] for j in range(32)]  #用來儲存元素是否訪問過
i = 0  #當前訪問元素下標記錄
j = 0  #當前訪問元素下標記錄
ret = [] #儲存訪問的結果
ret.append(m[i][j])
tag[i][j] = 1
while (j+1<32 and tag[i][j+1]==0) or (i+1<32 and tag[i+1][j]==0) or (j-1>=0 and tag[i][j-1]==0) or (i-1 >=0 and tag[i-1][j]==0):
    #右
    while j+1 < 32 and tag[i][j+1] == 0:
        ret.append(m[i][j+1])
        tag[i][j+1] = 1
        j += 1
    while i+1 < 32 and tag[i+1][j] == 0:
        ret.append(m[i+1][j])
        tag[i+1][j] = 1
        i += 1
    while j-1>=0 and tag[i][j-1] == 0:
        ret.append(m[i][j-1])
        tag[i][j-1] = 1
        j -= 1
    while i-1>=0 and tag[i-1][j] == 0:
        ret.append(m[i-1][j])
        tag[i-1][j] = 1
        i -= 1
retstrlist = [] #把結果轉成str,比賽時過於緊張忘記使用map()
for mi in ret:
    retstrlist.append(str(mi))
print(retstrlist)
fret = ','.join(retstrlist)
fret.replace(' ','')
print(fret) #最終結果