被围绕的区域【php版】

47 篇文章 1 订阅

在这里插入图片描述

此问题没什么难度,采用BFS和DFS都可以,从边界的’O’开始,将与之相连的’O’标记成另一种如’S’,最后再遍历整个矩阵,将’S’改为’O’,将’O’改为‘X’,即可。

class Solution {
	private $dirs = [
			[0, 1],
			[0, -1],
			[1, 0],
			[-1, 0],
		];

	/**
	 * @param String[][] $board
	 * @return NULL
	 */
	function solve(&$board) {
		$rowCnt = count($board);
		$colCnt = count($board[0]);

		$queue = new SplQueue();
		for ($i=0; $i<$colCnt; $i++) {
			if ($board[0][$i] == 'O') {
				$queue->enqueue([0, $i]);
			}
			if ($board[$rowCnt-1][$i] == 'O') {
				$queue->enqueue([$rowCnt-1, $i]);
			}
		}

		for ($j=1; $j<$rowCnt-1; $j++) {
			if ($board[$j][0] == 'O') {
				$queue->enqueue([$j, 0]);
			}
			if ($board[$j][$colCnt-1] == 'O') {
				$queue->enqueue([$j, $colCnt-1]);
			}
		}

		while (!$queue->isEmpty()) {
			$cell = $queue->dequeue();
			$board[$cell[0]][$cell[1]] = 'S';
			foreach ($this->dirs as $dir) {
				$newRow = $cell[0] + $dir[0];
				$newCol = $cell[1] + $dir[1];
				if ($newRow >=0 && $newRow < $rowCnt && $newCol >= 0 && $newCol < $colCnt && $board[$newRow][$newCol] == 'O') {
					$queue->enqueue([$newRow, $newCol]);
				}
			}
		}
		foreach ($board as &$rowData) {
			foreach ($rowData as &$cellData) {
				if ($cellData == 'S') {
					$cellData = 'O';
				} else if ($cellData == 'O') {
					$cellData = 'X';
				}
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值