Surrounded Regions
来源:互联网 发布:nginx处理空header 编辑:程序博客网 时间:2024/06/10 05:58
题目: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 XX O O XX X O XX O X X
After running your function, the board should be:
X X X XX X X XX X X XX O X X
思路:
一共是两种思路,不过本质都是一样,均是反其道而行,不进行正向的把里面的O改变成X,而是先把最外围的O变成另外一个符号,最后把其他符号均变成X,而把刚刚的那个改成O。
接下来就是BFS还是DFS了。
DFS写在代码里面,但是会出现栈溢出。
BFS似乎不会,我不知道为啥,只是能够成功。
具体的概念就是一旦在四周遇到O,那么存入堆栈,再插入周围的四个方向的。但是要在堆栈循环里面判断i和j是否满足数组范围条件啥的以及本身是否是O。
程序最后就是把其他的负号全部变成X,我所改变的那个负号变成O。即可。
代码:
class Solution {public:/* void solve(vector<vector<char>>& board) { if(board.empty()||board[0].empty()) return; int i=0,j=0; int m=board.size(),n=board[0].size(); for(;j<n-1;j++){ walk(board,i,j); } for(;i<m-1;i++){ //right walk(board,i,j); } for(;j>0;j--){ //down walk(board,i,j); } for(;i>0;i--){//left walk(board,i,j); } for(i=0;i<m;i++){ for(j=0;j<n;j++){ if(board[i][j]=='#') board[i][j]='O'; else board[i][j]='X'; } } } void walk(vector<vector<char> >&board,int i,int j){ //DFS if(i<0||i>=board.size()||j<0||j>=board[0].size()) return; if(board[i][j]=='O'){ board[i][j]='#'; walk(board,i-1,j); walk(board,i+1,j); walk(board,i,j-1); walk(board,i,j+1); } }*/ void bfs(int i, int j, vector<vector<char>>& board) { int n = board.size(); int m = board[0].size(); queue<pair<int, int>> q; q.push(make_pair(i, j)); while (!q.empty()) { auto top = q.front(); q.pop(); if (top.first >= 0 && top.first < n && top.second >= 0 && top.second < m && board[top.first][top.second] == 'O') { //如果没有这句话,那么你接下来的make_pair就会出错,溢出. board[top.first][top.second] = '#'; q.push(make_pair(top.first - 1, top.second)); q.push(make_pair(top.first + 1, top.second)); q.push(make_pair(top.first, top.second + 1)); q.push(make_pair(top.first, top.second - 1)); } } } void solve(vector<vector<char>>& board) { if(board.empty()||board[0].empty()) return; int m=board.size(),n=board[0].size(); for(int i=0;i<m;i++){ //最左边与最右边 if(board[i][0]=='O') walk( board,i,0); if(board[i][n-1]=='O') walk( board,i,n-1); } for(int i=1;i<n-1;i++){ //最上边与最下边 if(board[0][i]=='O') walk( board,0,i); if(board[m-1][i]=='O') walk( board,m-1,i); } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(board[i][j]=='#') board[i][j]='O'; else board[i][j]='X'; } } } void walk(vector<vector<char>>& board,int i,int j){ int m=board.size(),n=board[0].size(); queue<pair<int,int>>q; q.push(make_pair(i,j)); while(!q.empty()){ auto tem=q.front(); q.pop(); if(tem.first>=0&&tem.first<m&&tem.second>=0&&tem.second<=n&&board[tem.first][tem.second]=='O'){ board[tem.first][tem.second]='#'; q.push(make_pair(tem.first-1,tem.second)); q.push(make_pair(tem.first+1,tem.second)); q.push(make_pair(tem.first,tem.second-1)); q.push(make_pair(tem.first,tem.second+1)); } } }};
0 0
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- 八数码
- 37.Android Service 及 AIDL
- 黑马程序员——Java基础——集合(二)
- CXml - A Wrapping Class for MSXML 3.0/4.0/5.0/6.0
- Linux makefile 教程
- Surrounded Regions
- mysql安装(亲自安装过)
- 优化方法-爬山法
- 解决github push错误The requested URL returned error: 403 Forbidden while accessing
- KVO
- Python中的random模块
- mongoDB 基本操作,增删改查
- 机器学习笔记_数学基础_4-线性代数
- C++基础::shared_ptr 编程细节(一)