此问题没什么难度,采用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';
}
}
}
}
}