999.車的可用捕獲量
一、問題描述
在一個 8 x 8 的棋盤上,有一個白色車(rook)。也可能有空方塊,白色的象(bishop)和黑色的卒(pawn)。它們分別以字符 “R”,“.”,“B” 和 “p” 給出。大寫字符表示白棋,小寫字符表示黑棋。
車按國際象棋中的規則移動:它選擇四個基本方向中的一個(北,東,西和南),然後朝那個方向移動,直到它選擇停止、到達棋盤的邊緣或移動到同一方格來捕獲該方格上顏色相反的卒。另外,車不能與其他友方(白色)象進入同一個方格。
返回車能夠在一次移動中捕獲到的卒的數量。
二、示例
2.1示例1
2.2示例2
2.3示例3
注意
- board.length == board[i].length == 8
- board[i][j] 可以是 ‘R’,’.’,‘B’ 或 ‘p’
- 只有一個格子上存在 board[i][j] == ‘R’
三、解題思路
- 對於本題,首先,我們要找到
R
的位置,可以通過暴力遍歷的方式獲取到R
的座標位置 - 得到了
R
的位置之後,以R
的位置爲起點,分別向四個方向移動,遇到以下情況停止:- 超出棋盤邊界
- 遇到象
- 捕獲到卒
那麼如何處理車向四個方向移動呢?
- 首先我們將棋盤抽象成由
X(行)
和Y(列)
組成,則X(行)
設定爲從西到東方向,Y(列)
設定爲從北到南方向。即上北,下南,左西,右東,則x表示在X上的位置,y表示在Y上的位置。(0 + x, 1 + y)
:x座標不變,y前進一格,則是由西向東移動(1 + x, 0 + y)
: y座標不變,x前進一格,則是由北向南移動(0 + x, -1 + y)
: x座標不變,y後退一格,則是由東向西移動(-1 + x, 0 + y)
: y座標不變,x後退一格,則是由南向北移動
- 由此可見,我們可以把
x
的位置移動由數組[0, 1, 0, -1]
表示;y
的位置移動由數組[1, 0, -1, 0]
表示
四、代碼實現
方法一
/**
* @param {character[][]} board
* @return {number}
*/
var numRookCaptures = function(board) {
//定義四個方向
let dx = [0, 1, 0, -1]
let dy = [1, 0, -1, 0]
let x, y
// 定義最終捕獲到的卒的數量
let sum = 0
// 遍歷找到R的位置座標
for (let i=0; i<board.length; i++) {
for (let j=0; j<board[i].length; j++) {
if (board[i][j] == "R") {
x = i
y = j
break
}
}
}
// 分別朝四個方向移動
for (let k=0; k<4; k++) {
//移動的步數未知
for (let step=1;;step++) {
let tx = x + step * dx[k]
let ty = y + step * dy[k]
// 越界或碰到象的判斷
if (tx<0 || tx>=8 || ty<0 || ty>=8 || board[tx][ty] == "B") {
break
}
// 找到一個卒,加1
if (board[tx][ty] == "p") {
sum++
break
}
}
}
return sum
};
方法二:遞歸
/**
* @param {character[][]} board
* @return {number}
*/
//
function move(board, x, y, dx, dy) {
if (x<0 || y<0 || x>=8 || y>=8 || board[x][y]== 'B') {
return 0
}
if (board[x][y] == 'p') {
return 1
}
// 上面兩種情況都不滿足,那就繼續移動
x = x + dx
y = y + dy
// //返回吃掉的卒的個數
return move(board, x, y, dx, dy)
}
var numRookCaptures = function(board) {
let dx = [0, 1, 0, -1]
let dy = [1, 0, -1, 0]
let x, y
let sum = 0
for (let i=0; i<board.length; i++) {
for (let j=0; j<board[i].length; j++) {
if (board[i][j] == "R") {
x = i
y = j
// //一直向某一個方向移動,如果找到了卒或者遇到了象或者越界,就換另一個方向一直走
for (let k=0; k<4; k++) {
sum = sum + move(board, x, y, dx[k], dy[k])
}
return sum
}
}
return 0 // 棋盤中沒有車
}
};