【20190826】【校招筆試題】消消樂_京東(待續)

問題

同一行或者同一列出現三個的連在一起,那麼消除。


思路及代碼

# 這個是我參考的網上的代碼,自己做了部分改動寫出來的,參考代碼見最下面
import numpy as np
checkerboard = np.array([[3, 1, 2, 1, 1, ], \
                         [1, 1, 1, 1, 3], \
                         [1, 1, 1, 1, 1], \
                         [1, 1, 1, 1, 1], \
                         [3, 1, 2, 2, 2]])
# [row, col] = checkerboard.shape
row = checkerboard.shape[0]  # 獲取行數
col = checkerboard.shape[1]  # 獲取列數
flagList = [[1] * col for i in range(row)]   # 創建 row * col 的列表,初始爲 1,這種寫法很巧妙,學習一下!
flagList = np.array(flagList)

# for i in range(0, row-2):   # 這樣是不對的,因爲只有兩行和兩列沒有檢查!
#     for j in range(0, col-2):

for i in range(row):      # 這樣纔對,後面的兩個 if 是防止索引溢出。(這兩個 if 寫的很巧妙,學習一下!)
    for j in range(col):
        # 檢查每一行是否有三連,若有則消除
        if i + 1 < row and i + 2 < row:    # 檢查行時只需要防止 i 溢出(不然會有兩列沒有檢查)
            if checkerboard[i][j] == checkerboard[i + 1][j] and checkerboard[i][j] == checkerboard[i + 2][j]:
                flagList[i][j] = 0
                flagList[i + 1][j] = 0
                flagList[i + 2][j] = 0

        # 檢查每一列是否有三連,若有則消除
        if j + 1 < col and j + 2 < col:    # 檢查列時只需要防止 j 溢出(不然會有兩行沒有檢查)
            if checkerboard[i][j] == checkerboard[i][j + 1] and checkerboard[i][j] == checkerboard[i][j + 2]:
                flagList[i][j] = 0
                flagList[i][j + 1] = 0
                flagList[i][j + 2] = 0

# 打印消除後的棋盤
# print(np.multiply(checkerboard, flagList))  # 求矩陣對應元素相乘的兩種方式
print(checkerboard * flagList)    # 沒有消除的元素還照寫下來,消除的爲 0,索引我將 flagList 初始化爲全 1,消除的置零,那麼就可以用矩陣來計算結果。



################## 參考代碼 ###################
n, m = list(map(int, input().split()))
checkerboard = []
falg_list = [[0] * m for i in range(n)]  # 創建一個n行 m列的列表,初始值爲 0
# for i in range(n):
#     temp = input().split()
#     checkerboard.append(temp)
checkerboard = [[3, 1, 2, 1, 1,],\
                [1, 1, 1, 1, 3],\
                [1, 1, 1, 1, 1],\
                [1, 1, 1, 1, 1],\
                [3, 1, 2, 2, 2]]
for i in range(n):
    for j in range(m):
        # 檢查 每一列 是否有可以消除的,有的話,就設置 falg_list[i][j] 的值爲 1
        if i + 1 < n and i + 2 < n:
            if (checkerboard[i][j] == checkerboard[i + 1][j] and checkerboard[i][j] == checkerboard[i + 2][j]):
                falg_list[i][j] = 1
                falg_list[i + 1][j] = 1
                falg_list[i + 2][j] = 1

        # 檢查 每一行 是否有可以消除的,有的話,就設置 falg_list[i][j] 的值爲 1
        if j + 1 < m and j + 2 < m:
            if checkerboard[i][j] == checkerboard[i][j + 1] and checkerboard[i][j] == checkerboard[i][j + 2]:
                falg_list[i][j] = 1
                falg_list[i][j + 1] = 1
                falg_list[i][j + 2] = 1

# 打印消除後的棋盤
for i in range(n):
    for j in range(m):
        # falg_list[i][j] 的值爲 1 ,說明棋盤中的數字已被消除
        if falg_list[i][j] == 1:
            checkerboard[i][j] = 0
        print(checkerboard[i][j], end=' ')
    print()    # 每次循環之後都輸出一個回車,因此就是一個列表佔一行。

知識點

1. print() 輸出的 'end' 參數

end = '某字符串',某字符串是指跟在輸出之後的字符串,若 end 省略不寫,那麼默認爲 '\n',若不省略,那麼就沒有換行!

(參考:python 中類似print('*',end='')中end問題

2. numpy 獲取矩陣的行數和列數

(1) 同時獲取行數和列數:x.shape

(2) 獲取行數:x.shape[0]

(3) 獲取列數:x.shape[1]

x = np. array(某矩陣列表),那麼打印出來的 x 就是矩陣形式(更好看),如果不用這條語句,那麼輸出出來的矩陣沒有矩陣該有的形式(不直觀)。

(參考:Python獲取二維數組的行列數

3. 矩陣的兩種乘法運算

(1) 點乘(矩陣相乘):np.dot(A, B)

(2) 對應元素相乘:np.multiply(A, B) 或 A * B 兩種

(參考:Python中的幾種矩陣乘法(轉)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章