C++ 二维数组中从某一位置出发搜索其他方向上的点

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函数后面两个参数是增量,通过对这两个参数的设置,可以改变函数检测的方向。

xy方向
01
0-1
10
-10西
11东北
1-1东南
-11西北
-1-1西南

以后在编程时,遇到在网格上进行有限方向的搜索时,可以采用这种方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值