Python 中騎士攻擊
假設我們有一個二維二進位制矩陣,表示矩形的棋盤,其中 0 表示空單元格,1 表示騎士。騎士可以橫向移動兩個方格,縱向移動一個方格,或者縱向移動兩個方格,橫向移動一個方格(就像棋盤上的騎士)。我們必須檢查任意兩個騎士是否互相攻擊。
因此,如果輸入如下:
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 0 |
則輸出為 True
為了解決這個問題,我們將遵循以下步驟:
- 行數、列數表示矩陣的行數、列數
- 對於 0 到行數-1 的 r,執行
- 對於 0 到行數-1 的 c,執行
- 如果 A[r][c] 非零,則
- 對於每個 nr、nc 屬於 [(r+1, c-2), (r+1, c+2), (r+2, c-1), (r+2, c+1)],執行
- 如果 nr 在行數範圍內,nc 在列數範圍內,且 A[nr, nc] 非零,則
- 返回 True
- 如果 nr 在行數範圍內,nc 在列數範圍內,且 A[nr, nc] 非零,則
- 對於每個 nr、nc 屬於 [(r+1, c-2), (r+1, c+2), (r+2, c-1), (r+2, c+1)],執行
- 如果 A[r][c] 非零,則
- 對於 0 到行數-1 的 c,執行
- 返回 False
讓我們參閱以下實現,以加深理解:
示例
class Solution: def solve(self, A): row, col = len(A), len(A[0]) for r in range(row): for c in range(col): if A[r][c]: for nr, nc in ((r+1, c-2), (r+1, c+2), (r+2, c-1), (r+2, c+1)): if 0 <= nr < row and 0 <= nc <col and A[nr][nc]: return True return False ob = Solution() mat = [[0,0,0,0,0], [0,1,0,0,0], [0,0,0,1,0]] print(ob.solve(mat))
輸入
[[0,0,0,0,0], [0,1,0,0,0], [0,0,0,1,0]]
輸出
True
廣告