Surrounded Regions
来源:互联网 发布:淘宝购物车秒杀抢东西 编辑:程序博客网 时间:2024/05/16 03:29
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
不知道怎么地这个题一直放着没做。。。读一下题以后发现不难么,bfs或者dfs就可以了,一个数组来标识该点有没有被访问过。
记录下来所有访问过的点,以及一个标识flag,flag表示该点是不是在矩阵的边缘,如果在矩阵的边缘,则相应的连通块没有被X包围,不改动。
如果这个连通块的所有点都不在矩阵边缘,则应该将这个连通块全置为‘X’。
这里,如果是用bfs,则每次bfs完以后,将head置0,然后遍历队列里面的点,就是整个连通块。
如果用dfs,需要维护一个数组,则每次访问一个“有效”点,将这个点加入到这个数组中,然后再统一进行修改或不改动。
而这个题目,我用bfs ac以后,想着写一下dfs,果然,stack over flow了,看来在矩阵上想要进行dfs,矩阵规模稍大就会跪。。还是bfs来的靠谱,除非,将dfs改写成非递归。
class Solution {public: int row[50000]; int col[50000]; bool flag; bool** used; bool valid(vector<vector<char>> &board,int r,int c){ if(r<board.size() && c<board[0].size() && r>=0 && c>=0 && used[r][c]==false &&board[r][c]=='O'){ used[r][c] = true; return true; } return false; } int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; void bfs(vector<vector<char>> &board,int r,int c){ int head = 0; int tail = 0; row[tail] = r; col[tail++] = c; flag = (r>0 && r<board.size()-1 &&c>0 && c<board[0].size()-1); while(head!=tail){ int r2 = row[head]; int c2 = col[head]; head++; for(int i=0;i<4;i++){ if(valid(board,r2+dir[i][0],c2+dir[i][1])){ int x = r2+dir[i][0]; int y = c2+dir[i][1]; row[tail] = x; col[tail++] = y; flag = flag && x>0 && x<board.size()-1 && y>0 && y<board[0].size()-1; } } } if(flag){ for(int head=0;head<tail;head++){ board[row[head]][col[head]] = 'X'; } } } void solve(vector<vector<char>> &board) { int m = board.size(); if(m==0) return; int n = board[0].size(); used = new bool*[m]; for(int i=0;i<m;i++){ used[i] = new bool[n]; for(int j=0;j<n;j++) used[i][j] = false; } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(used[i][j]==true || board[i][j]=='X') continue; else{ bfs(board,i,j); } } } }};
接下来再贴一份用非递归实现的dfs
class Solution {public: bool** used; bool flag = true; vector<int> row; vector<int> col; int row_stack[50000]; int col_stack[50000]; int top = 0; int dir[4][2] = {{0,-1},{0,1},{-1,0},{1,0}}; bool valid(vector<vector<char>> &board,int r,int c){ return r>=0 && c>=0 && r<board.size() && c<board[0].size() && board[r][c]=='O' && !used[r][c]; } void dfs(vector<vector<char>> &board,int r,int c){ top=0; flag = true; used[r][c] = true; row_stack[top] = r; col_stack[top++] = c; flag = flag && r>0 && r<board.size()-1 && c>0 && c<board[0].size()-1; row.push_back(r); col.push_back(c); while(top>0){ int i = row_stack[--top]; int j = col_stack[top]; for(int k=0;k<4;k++){ int x = i+dir[k][0]; int y = j+dir[k][1]; if(valid(board,x,y)){ used[x][y]=true; flag = flag && x>0 && x<board.size()-1 && y>0 && y<board[0].size()-1; row_stack[top] = x; col_stack[top++] = y; row.push_back(x); col.push_back(y); } } } if(flag){ for(int i=0;i<row.size();i++) board[row[i]][col[i]]='X'; } row.clear(); col.clear(); } void solve(vector<vector<char>> &board) { int m = board.size(); if(m==0) return; int n = board[0].size(); used = new bool*[m]; for(int i=0;i<m;i++){ used[i] = new bool[n]; for(int j=0;j<n;j++) used[i][j] = false; } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(used[i][j]==true || board[i][j]=='X') continue; else{ dfs(board,i,j); } } } }};
事实证明,不是dfs差,而是用递归的dfs对栈的需求比较大,如果用迭代来实现的话,和bfs就没有性能上的区别了。。
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
- FusionCharts ID重复
- 【GBT28181开发:SIP协议实践】之注册流程
- JavaBean实现注册验证功能
- JSTL标签库引用无效
- Runnable和Thread的区别
- Surrounded Regions
- 求最大公约数
- cocos2dx python项目创建
- UML九种图之用例图
- Asp.net浅谈之一:Asp.net简介
- 百练 2754八皇后问题
- 《30天自制操作系统》学习笔记——第九天
- Android中的context、activity、intent、service使用详解
- Mirantis Fuel调研