题目:

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

For example,

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

After running your function, the board should be:

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

代码:

class Solution {
public:
void solve(vector<vector<char>>& board) {
const int ROW = board.size();
if ( ROW< ) return;
const int COL = board[].size();
// first row
for ( int i = ; i < COL; ++i )
{if ( board[][i]=='O') { board[][i] = 'M'; Solution::bfs(board, , i, ROW, COL); }}
// last row
for ( int i = ; i < COL; ++i )
{if ( board[ROW-][i]=='O' ) { board[ROW-][i] = 'M'; Solution::bfs(board, ROW-, i, ROW, COL); }}
// first col
for ( int i = ; i < ROW; ++i )
{if ( board[i][]=='O' ) { board[i][] = 'M'; Solution::bfs(board, i, , ROW, COL); }}
// last col
for ( int i = ; i < ROW; ++i )
{if ( board[i][COL-]=='O' ) { board[i][COL-]='M'; Solution::bfs(board, i, COL-, ROW, COL); }}
// flipping surrounded regions
for ( int i = ; i < ROW; ++i ){
for ( int j = ; j < COL; ++j ){
if ( board[i][j]=='O' ) { board[i][j]='X'; continue; }
if ( board[i][j]=='M' ) { board[i][j]='O'; continue; }
}
}
}
static void bfs(vector<vector<char> >& board, int row, int col, int ROW, int COL )
{
queue<pair<int, int> > que;
que.push(make_pair(row, col));
while ( !que.empty() ){
int r = que.front().first, c = que.front().second;
que.pop();
// up left down right
if ( r-> && board[r-][c]=='O' ) { board[r-][c]='M'; que.push(make_pair(r-, c)); }
if ( c-> && board[r][c-]=='O') { board[r][c-]='M'; que.push(make_pair(r, c-)); }
if ( r+<ROW- && board[r+][c]=='O' ) { board[r+][c]='M'; que.push(make_pair(r+, c)); }
if ( c+<COL- && board[r][c+]=='O' ) { board[r][c+]='M'; que.push(make_pair(r, c+)); }
}
}
};

tips:

参考的BFS的思路(http://yucoding.blogspot.sg/2013/08/leetcode-question-131-surrounded-regions.html

先说大体思路

这个思路正好与常规的思路逆过来:

1. 常规的思路是从wall里面挨个BFS遍历,如果从一个'O'出发的所有点都满足封住了,则这BFS走过的点都被封住了,最后赋值为'X'(这样会超时)

2. 而这道题的思路比较好的是逆过来,从边界的'O'出发BFS(因为只要跟边界的'O'连上了,就必然封不住了;而没有与边界的'O'边界连上的'O'自然被封住了)

再说实现细节:

1. 为了不使用额外空间,对于由边界'O'经BFS得到的'O'都置为'M'(M有两个意思:一是访问过了,不用再访问了;二是这个点再最后要恢复为'O')

2. BFS的时候,终止条件第一次直接写的是que.empty(),一直不对;后来改成了!que.empty()才对,这个低级错误不要再犯。

=========================================

第二次过这道题,有个细节没有注意:

如果发现一个点四周的点是要保留的‘O’时,一定要马上将其设置为‘M’,然后再进行BFS;如果不马上设置为‘M',那么在BFS的过程中,可能会重复过这个点。

class Solution {
public:
void solve(vector<vector<char> >& board)
{
if ( board.size()< ) return;
const int m = board.size();
const int n = board[].size();
// search from first row
for ( int i=; i<n; ++i )
{
if ( board[][i]=='O' ) Solution::bfs(board, , i, m, n);
}
// search from last row
for ( int i=; i<n; ++i )
{
if ( board[m-][i]=='O' ) Solution::bfs(board, m-, i, m, n);
}
// search from first column
for ( int i=; i<m; ++i )
{
if ( board[i][]=='O' ) Solution::bfs(board, i, , m, n);
}
// search from last column
for ( int i=; i<m; ++i )
{
if ( board[i][n-]=='O' ) Solution::bfs(board, i, n-, m, n);
}
// trans 'O' to 'X' & trans 'M' to 'O'
for ( int i=; i<m; ++i )
{
for ( int j=; j<n; ++j )
{
if ( board[i][j]=='O' )
{
board[i][j]='X';
continue;
}
if ( board[i][j]=='M' )
{
board[i][j]='O';
}
}
}
}
static void bfs(vector<vector<char> >& board, int r, int c, int ROW, int COL)
{
board[r][c] = 'M';
queue<pair<int, int> > curr;
queue<pair<int, int> > next;
curr.push(make_pair(r, c));
while ( !curr.empty() )
{
while ( !curr.empty() )
{
int i = curr.front().first;
int j = curr.front().second;
curr.pop();
// up
if ( i->= && board[i-][j]=='O' )
{
board[i-][j] = 'M';
next.push(make_pair(i-, j));
}
// down
if ( i+<ROW && board[i+][j]=='O' )
{
board[i+][j] = 'M';
next.push(make_pair(i+, j));
}
// left
if ( j->= && board[i][j-]=='O' )
{
board[i][j-] = 'M';
next.push(make_pair(i, j-));
}
// right
if ( j+<COL && board[i][j+]=='O' )
{
board[i][j+] = 'M';
next.push(make_pair(i, j+));
}
}
swap(next, curr);
}
}
};

【Surrounded Regions】cpp的更多相关文章

  1. hdu 4739【位运算】.cpp

    题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...

  2. Hdu 4734 【数位DP】.cpp

    题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~ ...

  3. 【Valid Sudoku】cpp

    题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...

  4. 【Permutations II】cpp

    题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...

  5. 【Subsets II】cpp

    题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...

  6. 【Sort Colors】cpp

    题目: Given an array with n objects colored red, white or blue, sort them so that objects of the same ...

  7. 【Sort List】cpp

    题目: Sort a linked list in O(n log n) time using constant space complexity. 代码: /** * Definition for ...

  8. 【Path Sum】cpp

    题目: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...

  9. 【Symmetric Tree】cpp

    题目: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). F ...

随机推荐

  1. RxJava2 中多种取消订阅 dispose 的方法梳理( 源码分析 )

    Github 相关代码: Github地址 一直感觉 RxJava2 的取消订阅有点混乱, 这样也能取消, 那样也能取消, 没能系统起来的感觉就像掉进了盘丝洞, 迷乱… 下面说说这几种情况 几种取消的 ...

  2. 【MFC】0xC0000005: 读取位置 0x00000020 时发生访问冲突

    原因:使用GetDlgItem()函数时需要先判断指针然后才可以使用. 错误代码: //重新建一个线程,查询帧同步 DWORD WINAPI SCsync_Thread(LPVOID Lparam) ...

  3. 【软件使用心得】Quartus和ISE调用Synplify进行综合的问题

    分别尝试采用Quartus和ISE调用第三方综合软件Synplify进行综合. [软件版本] Quartus II 13.0 (SP).ISE 14.4 .Synplify 201303. [问题描述 ...

  4. COGS 1944. 背驮式行走

    ★   输入文件:piggyback.in   输出文件:piggyback.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] Bessie和她妹妹Elsie白天都在牧场 ...

  5. Hybris ECP里Customer对应的数据库表

    SAP CRM里Account明细页面: SAP C4C里Account明细页面: 在Hybris storefront注册一个帐号: 注册成功之后能在backoffice里看到成功生成的custom ...

  6. javascript:理解try...catch...finally

    以前,我一直喜欢用console.log(do some thing)去执行输出的类型和值,想马上看到弹出的信息,就会直接在浏览器alert()一下,这些是基础知识. 稍微复杂一点点,就要用到判断语句 ...

  7. django建议入门-FYI

    django 简易博客 现在正式开始博客开发 1安装官方发布版 官方发布的版本带有一个版本号,例如1.0.3或1.1,而最新版本总是可以在http://www.djangoproject.com/do ...

  8. 如何修改集群的公网信息(包括 VIP) (文档 ID 1674442.1)

    适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.3 到 12.1.0.2 [发行版 11.2 到 12.1]本文档所含信息适用于所有平台 用 ...

  9. codeforces 600D Area of Two Circles' Intersection

    分相离,内含,想交三种情况讨论一下. 主要是精度和数据范围的问题,首先数据用long double,能用整型判断就不要用浮点型. 题目中所给的坐标,半径是整型的,出现卡浮点判断的情况还是比较少的. 最 ...

  10. SEO人士一定要了解的搜索引擎惩罚原则

       SEO人士一定要了解的搜索引擎惩罚原则 SEO 的人一般都知道SEO分为白帽,黑帽,甚至还有灰帽.简单说,如果你熟读过谷歌网站质量指南,就可以了解,符合搜索引擎质量规范并且符合用户体验的SEO ...