题目描述

给定一个二维的矩阵,包含 'X' 和 'O'字母 O)。

找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O''X' 填充。

示例:

X X X X
X O O X
X X O X
X O X X

运行你的函数后,矩阵变为:

X X X X
X X X X
X X X X
X O X X

解释:

被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

解题思路

分为两步:

  • 首先对矩阵四条边界上的所有'O'进行深度优先搜索,并将所有与边界相连区域的'O'填充为'#'
  • 然后遍历整个矩阵,将当前所有'O',即处在被 'X' 围绕的区域的'O'填充为'X',并将上一步填充的所有'#'还原为'O'

代码

 class Solution {
public:
void solve(vector<vector<char>>& board) {
if(board.empty() || board[].empty()) return;
int rows = board.size(), cols = board[].size();
for(int i = ; i < cols; i++){
if(board[][i] == 'O') fillBorder(board, , i);
if(board[rows - ][i] == 'O') fillBorder(board, rows - , i);
}
for(int i = ; i < rows; i++){
if(board[i][] == 'O') fillBorder(board, i, );
if(board[i][cols - ] == 'O') fillBorder(board, i, cols - );
}
for(int i = ; i < rows; i++){
for(int j = ; j < cols; j++){
if(board[i][j] == 'O') board[i][j] = 'X';
if(board[i][j] == '#') board[i][j] = 'O';
}
}
}
void fillBorder(vector<vector<char>>& board, int row, int col){
board[row][col] = '#';
if(row - >= && board[row - ][col] == 'O') fillBorder(board, row - , col);
if(row + < board.size() && board[row + ][col] == 'O') fillBorder(board, row + , col);
if(col - >= && board[row][col - ] == 'O') fillBorder(board, row, col - );
if(col + < board[].size() && board[row][col + ] == 'O') fillBorder(board, row, col + );
}
};

最新文章

  1. 各种Js封装
  2. OC编程之道-创建对象之单例模式
  3. MMO可见格子算法
  4. Android开发中这些小技巧
  5. .NET平台一些概念
  6. eclipse-SDK-3.7-win32;eclipse-java-indigo-win32;eclipse-jee-indigo-win32 区别(ZZ)
  7. 设置grub密码
  8. 绿色mysql启动脚本
  9. eval以及json
  10. [每日一题] OCP1z0-047 :2013-08-28 DELETE..........................................................160
  11. springmvc03-异常处理-静态文件
  12. Vue+Webpack构建去哪儿APP_一.开发前准备
  13. Linux_x86下NX与ASLR绕过技术(续)
  14. Hadoop工作原理
  15. VSTO:使用C#开发Excel、Word【2】
  16. JavaScript中的箭头函数
  17. 如何使用windows的计划任务?计划任务?
  18. bzoj3173 Splay 维护前缀中的最大值
  19. 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件
  20. HDU1087:Super Jumping! Jumping! Jumping!(简单dp)

热门文章

  1. NativeScript —— 初级入门(跨平台的手机APP应用)《一》
  2. windows下修改vagrant虚拟机中的html ,通过nginx访问后不生效
  3. Intellij IDEA显示调用时序图插件SequenceDiagram
  4. Oracle笔记(九) 表的创建及管理
  5. 如何设置树莓派 -Zero 自启动连接WIFI
  6. redis 的启动、关闭 判断其是否在运行中
  7. 设置本地cookie 存session 保持长期有效
  8. okhttp框架源码分析从同步&amp;异步请求使用开始
  9. 清除LabVIEW中波形图表或波形图中的历史数据
  10. Javac可以编译,Java显示找不到或无法加载主类