LeetCode上第999题——车的可用捕获量(详见LeetCode)
题目大概的意思是说从二维网格上的某一个点出发,往它的上下左右四个方向去检测是否有目标元素,计算元素的数目。解题代码如下
class Solution {
public:
int numRookCaptures(vector<vector<char>>& board) {
int i, j;
for (i = 0; i < board.size(); i++)
for (j = 0; j < board[0].size(); j++)
if (board[i][j] == 'R')
return cap(board, j, i, 0, -1) + cap(board, j, i, 0, 1) + cap(board, j, i, -1, 0) + cap(board, j, i, 1, 0);
return 0;
}
int cap(const vector<vector<char>> &board, int loc_x, int loc_y, int x, int y)
{
loc_x += x; loc_y += y;
while (loc_x < board[0].size() && loc_x >= 0 && loc_y < board.size() && loc_y >= 0) // 注意限制边界条件
{
if (board[loc_y][loc_x] == 'p') return 1; // 检测到卒,返回1
else if (board[loc_y][loc_x] == 'B') return 0; // 检测到象,返回0
loc_x += x; loc_y += y;
}
return 0; // 什么都没检测到,返回0
}
};
采用了分治的方法,每调用一个cap函数检测一个方向
numRookCaptures函数确定了原点的位置,然后调用cap函数。cap函数后面两个参数是增量,通过对这两个参数的设置,可以改变函数检测的方向。
x | y | 方向 |
---|---|---|
0 | 1 | 南 |
0 | -1 | 北 |
1 | 0 | 东 |
-1 | 0 | 西 |
1 | 1 | 东北 |
1 | -1 | 东南 |
-1 | 1 | 西北 |
-1 | -1 | 西南 |
以后在编程时,遇到在网格上进行有限方向的搜索时,可以采用这种方法。