Surrounded Regions

原题链接Surrounded Regions

给定一个二维方格,每个格子上只有’X’和’O’两种字符,要求将所有被’X’包围的’O’都变为’X’

如果直接求解,那么对于一个字符’O’而言,判断它是否能够被’X’包围是不太容易的事情。那么转换一下思路,可以找到所有不能被’X’包围的’O’,剩下的就全是被包围的了

如果一个’O’不能被’X’包围,那么从这个’O’开始一定有一条连通的路径到达方格的边界。所以可以从方格边界入手,如果碰到’O’,那么就从这个’O’开始一直走,途径每个’O’都是无法被’X’包围的’O’。可以先将这些’O’设置成其它字符,等到最后重新遍历时,这些其他字符仍然变为’O’,而其他的’O’则变为’X’

代码如下

class Solution {
public:void solve(vector<vector<char>>& board) {if(board.empty() || board[0].empty())return;int m = board.size();int n = board[0].size();for(int i = 0; i < m; ++i){if(board[i][0] == 'O')changeToOne(board, i, 0);if(board[i][n - 1] == 'O')changeToOne(board, i, n - 1);}for(int j = 0; j < n; ++j){if(board[0][j] == 'O')changeToOne(board, 0, j);if(board[m - 1][j] == 'O')changeToOne(board, m - 1, j);}for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){board[i][j] = (board[i][j] == '1') ? 'O' : 'X';}}}
private:void changeToOne(vector<vector<char>>& board, int row, int col){board[row][col] = '1';for(auto& p : directions){int x = row + p[0];int y = col + p[1];if(x < 0 || x >= board.size() || y < 0 || y >= board[x].size())continue;if(board[x][y] != 'O')continue;changeToOne(board, x, y);}}
private:static vector<vector<int>> directions;
};
vector<vector<int>> Solution::directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

通常情况下,如果遇到很难直接求解的问题时,可以尝试从另一个角度寻找答案。本题直接寻找被包围的’O’是不太容易的,所以可以先找那些不能被包围的’O’,剩下的就是要找的那些字符

每天一道LeetCode-----找到所有被某个字符包围的另一个字符相关推荐

  1. Java去除字符串最前面一个字符和最后面一个字符

    Java去除字符串最前面一个字符和最后面一个字符 public class demo {public static void main(String[] args) {String returnInf ...

  2. ios html 全选文本框,【前端】IOS input输入框按删除键删除字符,删除最后一个字符时,概率性出现光标前面多余一个字符...

    IOS input输入框按删除键删除字符,删除最后一个字符时,概率性出现光标前面多余一个字符,并且placeholder文字也能显示出来 回答 删除最后一个字符时延迟一毫秒 我用了vue,input[ ...

  3. 截字符串(汉字一个算两个字符,英文算一个字符)

    2019独角兽企业重金招聘Python工程师标准>>> ------摘自动易(RSSFeed.asp) '************************************** ...

  4. qstring删除最后一个字符_Excel去掉最后一个字符两个方法,正反思维,你支持哪一个?...

    本文将使用:LEN(字符串): 返回括号内字符个数SUBSITITUDE(字符串,被替换内容,替换为,被替换的序位号):返回替换后的字符串LEFT(字符串,提取位数)返回从左边提取后的字符串逆向思维: ...

  5. linux shell 获取字符串最后一个字符 去掉字符串最后一个字符 去掉末尾一个字符 去掉末尾两个字符

    1.获取字符串最后一个字符 实例如下: STR=123456abc FINAL=`echo ${STR: -1}` echo $FINAL # 输出结果 c 或者 STR=123456abc FINA ...

  6. java匹配两个字符_·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?...

    ·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配? 如题,·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?假如a字符串为:as*bnc·b,b字符串为asdfgvbbnc ...

  7. shell 获取字符串前两个字符串、获取字符串最后一个字符、去掉字符串最后一个字符、去掉末尾一个字符、去掉末尾两个字符

    1. 获取字符串前两个字符串 temp=`echo $RANDOM|md5sum|sed 's/../&:/g'|cut -c 1-17` echo $temp echo ${temp:0:2 ...

  8. python从右向左第三个字符_字符串是一个字符序列,例如,字符串s,从右侧向左第3个字符用什么索引?_学小易找答案...

    [填空题]表达式 'aaasdf'.rstrip('af') 的值为 _______________ . [填空题]表达式 'Hello world!'.count('l') 的值为 ________ ...

  9. python从右向左第三个字符_字符串是一个字符序列,例如,字符串s,从右侧向左第3个字符用________索引。...

    [判断题]已知 x, y = 3, 5,那么执行x, y = y, x 之后,x的值为15. [多选题]Python 中对变量描述正确的选项是( ) [单选题]字符串是一个连续的字符序列,用_____ ...

最新文章

  1. c# mysql 编码_C#编码问题以及C#往Mysql插数据编码问题
  2. 1111 Online Map (30 分)【难度: 一般 / 知识点: Dijkstra最短路】
  3. 使用加密工具类进行有效的字符串加密——CSDN博客
  4. 单片机蜂鸣器编程音乐_基于单片机的智能鱼缸温控系统设计
  5. 龙芯购买MIPS指令集的授权
  6. MyEclipse下XFire开发Webservice实例
  7. kmeans中的k的含义_《K-means》知识点与思考
  8. codeforces 735C Tennis Championship(贪心+递推)
  9. 使用iMazing将PDF文件导入至iOS设备
  10. latm header与 ADTS header之间的转换
  11. 超实用的容器镜像漏洞检测工具 Trivy 入门指南
  12. Oracle的本地网络服务名配置
  13. 【C语言典例】——day8:猜名次
  14. 技术经理成长复盘-处理线上问题
  15. ftrack出免费软件了--cineSync Paly
  16. 一加 Ace 竞速版什么时候发布 一加 Ace 竞速版配置怎么样
  17. VS2005宏无法运行的问题(打了补丁MS14-009之后)
  18. MUI click事件无效 click没反应 click监听不到
  19. 如何打出带圈的11?
  20. C4D模型工具—沿着法线移动/缩放/旋转

热门文章

  1. Java黑皮书课后题第6章:*6.6(显示图案)编写方法显示如下图案:public static void displayPattern(int n)
  2. Java黑皮书课后题第5章:*5.9(找出得最高分的前两个学生)编写程序,提示用户输入学生的个数、每个学生名字及分数,最后显示获得最高分的学生
  3. 队列 集合的前n个元素
  4. Mybatis逆向工程的pojo实现序列化接口的代码
  5. ArrayList的实现原理
  6. 从零开始搭建系统3.2——微服务注册中心开发及部署
  7. php数组array_push()和array_pop()以及array_shift()函数
  8. 【CSS3】-webkit-margin-before与margin-top
  9. iscroll5 上拉,下拉 加载数据
  10. 寫一個函數計算當參數為 n(n很大) 時的值 1-2+3-4+5-6+7……+n