方向数组,系统一点的思路
题目:
在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。
车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。
返回车能够在一次移动中捕获到的卒的数量。
示例 1:
输入:[[".",".",".",".",".",".",".","."],[".",".",".",“p”,".",".",".","."],[".",".",".",“R”,".",".",".",“p”],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",“p”,".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释:
在本例中,车能够捕获所有的卒。
示例 2:
输入:[[".",".",".",".",".",".",".","."],[".",“p”,“p”,“p”,“p”,“p”,".","."],[".",“p”,“p”,“B”,“p”,“p”,".","."],[".",“p”,“B”,“R”,“B”,“p”,".","."],[".",“p”,“p”,“B”,“p”,“p”,".","."],[".",“p”,“p”,“p”,“p”,“p”,".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:0
解释:
象阻止了车捕获任何卒。
示例 3:
输入:[[".",".",".",".",".",".",".","."],[".",".",".",“p”,".",".",".","."],[".",".",".",“p”,".",".",".","."],[“p”,“p”,".",“R”,".",“p”,“B”,"."],[".",".",".",".",".",".",".","."],[".",".",".",“B”,".",".",".","."],[".",".",".",“p”,".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释:
车可以捕获位置 b5,d6 和 f5 的卒。
提示:
board.length == board[i].length == 8
board[i][j] 可以是 ‘R’,’.’,‘B’ 或 ‘p’
只有一个格子上存在 board[i][j] == ‘R’
解法:
// Solution One -- 传统4个while
/**
* @param {character[][]} board
* @return {number}
*/
// 60ms 33.8mb
var numRookCaptures0 = function(board) {
let m = 0, n = 0, count = 0
// 先找到R的位置
for(let i = 0; i < 8; i++){
for(let j = 0; j < 8; j++){
if(board[i][j] === 'R'){
m = i
n = j
// 开始判断四个方向能收录的个数
// 上
while(n >= 0) {
if(board[i][n] == 'p'){
count += 1
break
}else if(board[i][n] == 'B'){
break
}
n--
}
// 下
n = j
while(n < 8) {
if(board[i][n] == 'p'){
count += 1
break
}else if(board[i][n] == 'B'){
break
}
n++
}
// 左
while(m >= 0) {
if(board[m][j] == 'p'){
count += 1
break
}else if(board[m][j] == 'B'){
break
}
m--
}
// 右
m = i
while(m < 8) {
if(board[m][j] == 'p'){
count += 1
break
}else if(board[m][j] == 'B'){
break
}
m++
}
break // 一定break
}
}
}
return count
};
// Solution Two -- 方向数组
// 64ms 33.9mb
var numRookCaptures1 = function(board){
let count = 0, m = 0, n = 0
const dx = [0, 1, 0, -1], dy = [1, 0, -1, 0]
for(let i = 0; i < 8; i++){
for(let j = 0; j< 8; j++){
if(board[i][j] === 'R'){
m = i
n = j
break
}
}
}
// 4 -> 4个方向
for(let i = 0; i < 4; i++){
for(let step = 0; ; step ++){
let tx = m + step * dx[i],
ty = n + step * dy[i]
if(tx < 0 || tx >= 8 || ty < 0 || ty >= 8 || board[tx][ty] === 'B') break
if(board[tx][ty] === 'p'){
count++
break
}
}
}
return count
}