解題思路
解法一:暴力窮舉
先找出車所在的行與列,然后分四個方向遍歷尋找,分三種情況:
1)要么當(dāng)遇到象則退出本方向循環(huán)湿痢;
2)要么遇到第一個卒時霍骄,計數(shù)加一台囱,然后退出本方向的循環(huán);
3)要么到棋盤邊緣也沒遇到卒读整,則退出本次循環(huán)簿训。
最后返回總個數(shù)即可。
復(fù)雜度分析
時間復(fù)雜度:O(n^2),其中 n 是棋盤的邊長强品。找白色車在棋盤中的位置需要 O(n^2)的時間復(fù)雜度膘侮,模擬車在四個方向上捕獲顏色相反的卒需要 O(n) 的時間復(fù)雜度,所以一共需要 O(n^2+n) = O(n^2) 的時間復(fù)雜度的榛。
空間復(fù)雜度:O(1)琼了,只需要常數(shù)空間存放若干變量。
解法二:深度優(yōu)先搜索DFS
先找出車所在的行與列夫晌,然后分四個方向?qū)ζ溥M行深度搜索雕薪。
1)如果已經(jīng)到達棋盤邊緣,則返回晓淀;
1)如果碰到象所袁,則返回;
2)如果碰到一個卒要糊,計數(shù)加一纲熏,然后返回;
3)否則繼續(xù)沿當(dāng)前方向進行深度搜索锄俄,直到滿足以上三個返回條件之一局劲。
最后統(tǒng)計總個數(shù)即可。
代碼
解法一:暴力窮舉
class Solution:
def numRookCaptures(self, board: List[List[str]]) -> int:
m = len(board)
n = len(board[0])
a, b = 0, 0
for i in range(m):
for j in range(n):
if board[i][j] == 'R':
a = i
b = j
break
count = 0
for k in range(b,-1,-1):
if board[a][k] == 'B':
break
if board[a][k] == 'p':
count += 1
break
for k in range(b,n):
if board[a][k] == 'B':
break
if board[a][k] == 'p':
count += 1
break
for t in range(a,-1,-1):
if board[t][b] == 'B':
break
if board[t][b] == 'p':
count += 1
break
for t in range(a,m):
if board[t][b] == 'B':
break
if board[t][b] == 'p':
count += 1
break
return count
解法二:深度優(yōu)先搜索DFS
代碼1
class Solution:
def numRookCaptures(self, board: List[List[str]]) -> int:
self.ans = 0
def dfs(i, j, dx, dy):
if i < 0 or i >= 8 or j < 0 or j >= 8: return
if board[i][j] == 'B': return
if board[i][j] == 'p':
self.ans += 1
return
dfs(i + dx, j + dy, dx, dy)
for i in range(8):
for j in range(8):
if board[i][j] == 'R':
dfs(i + 1, j, 1, 0)
dfs(i - 1, j, -1, 0)
dfs(i, j + 1, 0, 1)
dfs(i, j - 1, 0, -1)
return self.ans
代碼2
class Solution:
def numRookCaptures(self, board: List[List[str]]) -> int:
m = len(board)
n = len(board[0])
def dfs(i, j, dx, dy):
count = 0
if (i<0 or i>=8 or j<0 or j>=8):
return count
if board[i][j]=='B':
return count
if board[i][j]=='p':
count = 1
return count
count += dfs(i+dx, j+dy, dx, dy)
return count
num = 0
for i in range(m):
for j in range(n):
if board[i][j]=="R":
num += dfs(i, j+1, 0, 1)
num += dfs(i, j-1, 0, -1)
num += dfs(i+1, j, 1, 0)
num += dfs(i-1, j, -1, 0)
return num