问题:

输入一个矩阵,将被X字符包围的O字符全部替换为X,但是如果某个O字符处于矩阵的边界,则该O字符及其连接的所有O字符都不变。

输出替换后的矩阵。

思路:

先遍历矩阵每一个字符,当发现O字符,则利用深搜方式找出与之相连的所有O字符。

每找出一个O字符,则先将其改为X字符,并将相连接的四个方向的O字符的坐标存入search栈中。并且将这个替换后的字符的坐标,保存在recover栈中。

在搜索相连接的O字符时,如果发现所连接的是边界字符,则说明这次找到的O字符区域,是不需要改变的,但是因为我们之前都改为X了(为了避免重复搜索字符),所以最后的时候,将找到的这部分字符区域,重新标记为F字符。

最后在检索完所有字符区域后,就将F字符恢复为O字符。

代码:

 1 class Solution {
 2 public:
 3     void solve(vector<vector<char>>& board) {
 4         if (board.size() == 0) return;
 5         rows = board.size();
 6         cols = board[0].size();
 7         for (int i = 0; i < rows; i++) {
 8             for (int j = 0; j < cols; j++) {
 9                 if (i > 0 && i < rows - 1 && j > 0 && j < cols - 1 && board[i][j] == 'O') {
10                     searchAndRecover(board, i, j);
11                 }
12             }
13         }
14         for (int i = 0; i < rows; i++) {
15             for (int j = 0; j < cols; j++) {
16                 if (board[i][j] == 'F') {
17                     board[i][j] = 'O';
18                 }
19             }
20         }
21     }
22     void searchAndRecover(vector<vector<char>>& board, int x, int y) {
23         // intialize
24         searching.clear();
25         recover.clear();
26         int directions[4][2] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}};
27         bool need_recovery = false;
28         // store the original one
29         pair<int, int> origin(x, y);
30         searching.push_back(origin);
31         while (!searching.empty()) {
32             // get the top of the stack
33             pair<int, int> tmp = searching.back();
34             searching.pop_back();
35             // change the value
36             board[tmp.first][tmp.second] = 'X';
37             recover.push_back(tmp);
38             for (int i = 0; i < 4; i++) {
39                 int tmp_x = tmp.first + directions[i][0];
40                 int tmp_y = tmp.second + directions[i][1];
41                 if (tmp_x >= 0 && tmp_x < rows && tmp_y >= 0 && tmp_y < cols && board[tmp_x][tmp_y] == 'O') {
42                     if (tmp_x > 0 && tmp_x < rows - 1 && tmp_y > 0 && tmp_y < cols - 1) {
43                         pair<int, int> add_point(tmp_x, tmp_y);
44                         searching.push_back(add_point);
45                     }
46                     else {
47                         need_recovery = true;
48                     }
49                 }
50             }
51         }
52         if (need_recovery) {
53             while (!recover.empty()) {
54                 pair<int, int> tmp = recover.back();
55                 board[tmp.first][tmp.second] = 'F';
56                 recover.pop_back();
57             }
58         }
59     }
60 private:
61     int rows;
62     int cols;
63     vector<pair<int, int>> searching;
64     vector<pair<int, int>> recover;
65 };

转载于:https://www.cnblogs.com/leo-lzj/p/11541601.html

LC-130 被环绕区域相关推荐

  1. word默认文字环绕方式是什么_在Word 2010文档中设置图片文字环绕方式

    默认情况下,插入到Word 2010文档中的图片作为字符插入到Word 2010文档中,其位置随着其他字符的改变而改变,用户不能自由移动图片.而通过为图片设置文字环绕方式,则可以自由移动图片的位置,操 ...

  2. Css实现刘海,使用CSS Shapes实现滚动环绕iPhone X刘海效果

    一.iPhone X的刘海发型和衍生的交互 iPhone X造型上有个显著的特质,就是有个明显的刘海. 然后,也出现了一些酷酷的交互. 就是页面滚动的时候,列表会自动绕着iPhone X的刘海排列. ...

  3. 借助CSS Shapes实现元素滚动自动环绕iPhone X的刘海 #精选JAVASCRIPTCSSCHROMECSS3APPLE

    一.iPhone X的刘海发型和衍生的交互 iPhone X造型上有个显著的特质,就是有个明显的刘海. 然后,也出现了一些酷酷的交互. 例如下面这个交互: 交互视频效果戳这里体验:http://t.c ...

  4. 借助CSS Shapes实现元素滚动自动环绕iPhone X的刘海

    一.iPhone X的刘海发型和衍生的交互 iPhone X造型上有个显著的特质,就是有个明显的刘海. 然后,也出现了一些酷酷的交互. 例如下面这个交互: 交互视频效果戳这里体验:http://t.c ...

  5. iphone桌面滑动效果html5,使用CSS Shapes实现滚动环绕iPhone X刘海效果

    一.iPhone X的刘海发型和衍生的交互 iPhone X造型上有个显著的特质,就是有个明显的刘海. 然后,也出现了一些酷酷的交互. 例如下面这个交互视频效果:http://t.cn/Rp01GKc ...

  6. 入门深度学习,先看看三位顶级大牛Yann LeCun、Yoshua Bengio和Geoffrey Hinton的联合综述

    [编者按]深度学习领域的三位大牛Yann LeCun.Yoshua Bengio和Geoffrey Hinton无人不知无人不晓.此前,为纪念人工智能提出60周年,Yann LeCun.Yoshua ...

  7. 《Nature》纪念人工智能60周年专题:深度学习综述

    来源:网络大数据 摘要:本文是<Nature>杂志为纪念人工智能60周年而专门推出的深度学习综述,也是Hinton.LeCun和Bengio三位大神首次合写同一篇文章. 本文是<Na ...

  8. 深度学习综述:Hinton、Yann LeCun和Bengio经典重读

    来源:人工智能头条 翻译 | kevin,刘志远 审校 | 李成华 深度学习三巨头Geoffrey Hinton.Yann LeCun和Yoshua Bengio对AI领域的贡献无人不知.无人不晓.本 ...

  9. 深度学习综述(LeCun、Bengio和Hinton)

    原文摘要:深度学习可以让那些拥有多个处理层的计算模型来学习具有多层次抽象的数据的表示.这些方法在许多方面都带来了显著的改善,包括最先进的语音识别.视觉对象识别.对象检测和许多其它领域,例如药物发现和基 ...

  10. 深度学习-LeCun、Bengio和Hinton的联合综述-Deep Learning一篇nature综述论文

    深度学习-LeCun.Bengio和Hinton的联合综述 原文摘要:深度学习可以让那些拥有多个处理层的计算模型来学习具有多层次抽象的数据的表示.这些方法在许多方面都带来了显著的改善,包括最先进的语音 ...

最新文章

  1. CactiEZ安装配置教程
  2. 使用clear fix清除浮动
  3. MySQL—表的完整性约束(外键约束)(二)
  4. JaveWeb中实现分页的总结
  5. 链表之删除单链表倒数第K个节点
  6. 执行Hive语句报错:FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Access denied for user '
  7. 苹果手机数据线充不了电_手机充电器充不了电?其实4招就能解决
  8. PATH和CLASSPATH
  9. 如何强制在访问博客园博客的时候变成博客园分配的二级域名方式
  10. vue设置右边距_数控CNC雕刻机使用系列之二: 维宏软件的参数设置
  11. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结
  12. Android也行5view斜体,Android TextView同时设置粗体和斜体
  13. 在Android Eclipse 开发如何 使用 (*.aar)文件
  14. 四万字 Lambda 表达式完整教程(强烈建议收藏)
  15. 任意角度旋转图片的ground truth目标检测框
  16. 森林图怎么分析_图说meta十一:森林图暨RevMan软件使用方法简介
  17. 美光科技正式回应“诉中禁令”
  18. Simulink自动代码生成2——生成嵌入式代码(generating embedded code)
  19. harmonyos用英语怎么说,华为在欧盟知识产权局申请HarmonyOS专利 或为鸿蒙系统的英文名称...
  20. Facebook如何用大数据

热门文章

  1. Windows核心编程_在Visual Studio窗口输出调试信息
  2. CMake构建_增加编译选项(debugrelease)
  3. 一步一步使用标c编写跨平台图像处理库
  4. 复杂,软件的大敌![转]
  5. win7重新安装后删除文件权限不够(小技巧)
  6. 学习笔记之15道简单算法题
  7. Linux 内核 链表 的简单模拟(1)
  8. 启动virt-manager报错:Failed to open /var/lib/dbus/machine-id
  9. [Web开发] Web程序调式的利器 - Fiddler (HTTP协议监视工具)
  10. AVIator -- Bypass AV tool