可以被一步捕获的棋子数。题意是给一个棋盘,你可以控制白色的车,用字符R表示,棋盘上其他白色的棋子用大写字母表示,其他黑色的棋子用小写字母表示,求问棋盘上你的车能一步吃掉的卒(小写p)有几个。比如这个例子,车能吃掉3个卒。
这个题没有什么算法,就是按规则从车所在的位置开始扫描4个不同的方向,遇到小写的p则res++,遇到边缘和大写的字母(因为是白色棋子)则停下。
时间O(n^2)
空间O(1)
Java实现
1 class Solution { 2 public int numRookCaptures(char[][] board) { 3 // 定义上下左右四个方向 4 int[] dx = { -1, 1, 0, 0 }; 5 int[] dy = { 0, 0, -1, 1 }; 6 7 for (int i = 0; i < 8; i++) { 8 for (int j = 0; j < 8; j++) { 9 // 找到白车所在的位置 10 if (board[i][j] == 'R') { 11 // 分别判断白车的上、下、左、右四个方向 12 int res = 0; 13 for (int k = 0; k < 4; k++) { 14 int x = i, y = j; 15 while (true) { 16 x += dx[k]; 17 y += dy[k]; 18 if (x < 0 || x >= 8 || y < 0 || y >= 8 || board[x][y] == 'B') { 19 break; 20 } 21 if (board[x][y] == 'p') { 22 res++; 23 break; 24 } 25 } 26 } 27 return res; 28 } 29 } 30 } 31 return 0; 32 } 33 }
JavaScript实现
1 /** 2 * @param {character[][]} board 3 * @return {number} 4 */ 5 var numRookCaptures = function(board) { 6 let dx = [-1, 1, 0, 0]; 7 let dy = [0, 0, -1, 1]; 8 for (let i = 0; i < 8; i++) { 9 for (let j = 0; j < 8; j++) { 10 if (board[i][j] == 'R') { 11 let res = 0; 12 for (let k = 0; k < 4; k++) { 13 let x = i; 14 let y = j; 15 while (true) { 16 x += dx[k]; 17 y += dy[k]; 18 if ( 19 x < 0 || 20 x >= 8 || 21 y < 0 || 22 y >= 8 || 23 board[x][y] == 'B' 24 ) { 25 break; 26 } 27 if (board[x][y] == 'p') { 28 res++; 29 break; 30 } 31 } 32 } 33 return res; 34 } 35 } 36 } 37 return 0; 38 };