問題
同一行或者同一列出現三個的連在一起,那麼消除。
思路及代碼
# 這個是我參考的網上的代碼,自己做了部分改動寫出來的,參考代碼見最下面
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中的幾種矩陣乘法(轉))