leetCode_ Surrounded Regions(BFS)
来源:互联网 发布:解放战争胜利原因知乎 编辑:程序博客网 时间:2024/05/16 17:48
题意:在由X和O组成的一个二维数组,把用X包围住的那些O改成X。
方法一:DFS(会超内存)
思想很简单,对于每一个还没有用过的O,把相邻的O全部找出来,并把这些x坐标,y坐标记录下来,如果这个O在第一行,第一列,最后一行,最后一列,则这一个区域都不能变。由于DFS可能堆栈会很大,所以会超时。
代码如下:
<span style="font-size:18px;">class Solution {public: vector<int> x; vector<int> y; vector<vector<bool>> isUsed; int tag; void check(vector<vector<char>>& board,int ix,int iy,int m,int n) { isUsed[ix][iy]=true; x.push_back(ix); y.push_back(iy); if(ix==0||iy==0||ix==m-1||iy==n-1) { tag=1; return; } if(ix-1>=0&&ix-1<m&&iy>=0&&iy<n&&board[ix-1][iy]=='O'&&isUsed[ix-1][iy]==false) check(board,ix-1,iy,m,n); if(ix+1>=0&&ix+1<m&&iy>=0&&iy<n&&board[ix+1][iy]=='O'&&isUsed[ix+1][iy]==false) check(board,ix+1,iy,m,n); if(ix>=0&&ix<m&&iy-1>=0&&iy-1<n&&board[ix][iy-1]=='O'&&isUsed[ix][iy-1]==false) check(board,ix,iy-1,m,n); if(ix>=0&&ix<m&&iy+1>=0&&iy+1<n&&board[ix][iy+1]=='O'&&isUsed[ix][iy+1]==false) check(board,ix,iy+1,m,n); } void solve(vector<vector<char>>& board) { int i,j,m,n,k; m=board.size(); if(m==0) return; n=board[0].size(); vector<bool> temp; for(i=0;i<n;i++) temp.push_back(false); for(i=0;i<m;i++) isUsed.push_back(temp); for(i=0;i<m;i++) { for(j=0;j<n;j++) { if(board[i][j]=='O'&&isUsed[i][j]==false) { tag=0; x.clear(); y.clear(); check(board,i,j,m,n); if(tag==0) { for(k=0;k<x.size();k++) board[x[k]][y[k]]='X'; } } } } }};</span>方法二:BFS(可行)
从第一列、第一行、最后一列、最后一行的O进行四个方向的扩展,把能扩展到的O都标记一下。扩展完之后,对于二维数组的每个O,如果他刚才被扩展到了,则不变成X,否则,则变成X。
代码如下:
class Solution {public: vector<int> x; vector<int> y; vector<vector<bool>> isUsed; int tag; void check(vector<vector<char>>& board,int ix,int iy,int m,int n) { if(isUsed[ix][iy]) return; int d[4][2]={{0,-1},{0,1},{1,0},{-1,0}},cx,cy,i; queue<int> xs; queue<int> ys; xs.push(ix); ys.push(iy); isUsed[ix][iy]=true; while(!xs.empty()) { cx=xs.front(); xs.pop(); cy=ys.front(); ys.pop(); for(i=0;i<4;i++) { if(cx+d[i][0]>=0&&cx+d[i][0]<m&&cy+d[i][1]>=0&&cy+d[i][1]<n&&isUsed[cx+d[i][0]][cy+d[i][1]]==false &&board[cx+d[i][0]][cy+d[i][1]]=='O') { xs.push(cx+d[i][0]); ys.push(cy+d[i][1]); isUsed[cx+d[i][0]][cy+d[i][1]]=true; } } } } void solve(vector<vector<char>>& board) { int i,j,m,n,k; m=board.size(); if(m==0) return; n=board[0].size(); vector<bool> temp; for(i=0;i<n;i++) temp.push_back(false); for(i=0;i<m;i++) isUsed.push_back(temp); for(i=0;i<m;i++) { if(board[i][0]=='O') check(board,i,0,m,n); if(board[i][n-1]=='O')check(board,i,n-1,m,n); } for(i=0;i<n;i++) { if(board[0][i]=='O') check(board,0,i,m,n); if(board[m-1][i]=='O')check(board,m-1,i,m,n); } for(i=0;i<m;i++) { for(j=0;j<n;j++) { if(board[i][j]=='O'&&isUsed[i][j]==false) board[i][j]='X'; } } }};好吧,我承认第二种方法是参考网上的。不过代码是自己写的。继续加油~
1 0
- leetCode_ Surrounded Regions(BFS)
- 【DFS||BFS】Surrounded Regions
- Surrounded Regions ,BFS
- LeetCode[BFS]: Surrounded Regions
- 130:Surrounded Regions【BFS】
- Surrounded Regions BFS遍历
- LeetCode - Surrounded Regions(BFS)
- (LeetCode 130) Surrounded Regions(BFS)
- 130. Surrounded Regions(BFS)
- (M)BFS:130. Surrounded Regions
- [leetcode] 130 surrounded regions dfs bfs
- 【LeetCode】 Surrounded Regions (BFS && DFS)
- leetCode-Surrounded Regions DFS与BFS解法
- leetcode -- Surrounded Regions -- 典型题。BFS
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- iOS开发- 常见日志打印
- 操作系统——进程管理
- LINUX FTP用户的创建
- 解析目前NFC具有的三种工作模式
- 考的不好,不想多说
- leetCode_ Surrounded Regions(BFS)
- 增加eclipse的运行内存
- 机器学习的10大基础算法
- storm ack机制//
- 并发之阻塞队列&线程池
- DexHunter学习笔记记录2
- [SC] OpenService 失败:1060指定的服务未安装
- iOS8 Size Classes的理解与使用
- 检测新版本,PullToRefreshListView刷新,加载