1. 题目描述
在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。
车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。
返回车能够在一次移动中捕获到的卒的数量。
示例 1:
image输入:[[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释: 在本例中,车能够捕获所有的卒。
提示:
board.length == board[i].length == 8
board[i][j] 可以是 'R','.','B' 或 'p'
只有一个格子上存在 board[i][j] == 'R'
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/available-captures-for-rook
2. 解题思路
这道题思路简单,只需要找到车,然后向东南西北四个方向上遍历一下就行,如果遍历的过程中碰到空白就继续,碰到象就退出,碰到卒就计数器加一再推出。
2.1 代码
代码比较冗余,但是没什么优化的动力~
/**
* @param {character[][]} board
* @return {number}
*/
var numRookCaptures = function(board) {
// if (!board.length || !board[0].length) return 0
let res = 0
for (let i = 0; i < board.length; i++) {
for (let j = 0; j < board[0].length; j++) {
if (board[i][j] === 'R') {
console.log(i, j)
for (let m = i+1; m < board.length; m++) {
if (board[m][j] === '.') continue
if (board[m][j] === 'B') break
if (board[m][j] === 'p') {
res += 1
break
}
}
for (let m = i-1; m > -1; m--) {
if (board[m][j] === '.') continue
if (board[m][j] === 'B') break
if (board[m][j] === 'p') {
res += 1
break
}
}
for (let n = j+1; n < board[0].length; n++) {
if (board[i][n] === '.') continue
if (board[i][n] === 'B') break
if (board[i][n] === 'p') {
res += 1
break
}
}
for (let n = j-1; n > -1; n--) {
if (board[i][n] === '.') continue
if (board[i][n] === 'B') break
if (board[i][n] === 'p') {
res += 1
break
}
}
break
}
}
}
return res
};
网友评论