(nice!!!)(LeetCode 面试经典 150 题 ) 130. 被围绕的区域(深度优先搜索dfs || 广度优先搜索bfs)
题目:130. 被围绕的区域
三种解法:
C++版本:采用的是遍历所有元素,如果是’O’,则进行bfs。
JAVA版本:遍历所有边上的元素,并采用额外的状态数组来标记情况
GO版本:遍历所有边上的元素,但是在原数组中进行状态标记。
C++版本:
class Solution {
public:typedef pair<int,int> PII;int fx[4]={0,0,-1,1};int fy[4]={1,-1,0,0};void bfs(int X,int Y,vector<vector<char>>& board,vector<vector<bool>>& sta){//采用广度优先搜索bfsqueue<PII> qu;// 记录当前遍历的所有‘O’vector<PII> v;// 初始化qu.push({X,Y});sta[X][Y]=true;// 判断是否被围住bool flag=true;int n=board.size(),m=board[0].size();// 遍历队列quwhile(qu.size()){PII tmp=qu.front();qu.pop();v.push_back(tmp);// 遍历可能的领居节点for(int i=0;i<4;i++){int x=tmp.first+fx[i];int y=tmp.second+fy[i];if(x<0||y<0||x>=n||y>=m) continue;if(board[x][y]=='X'||sta[x][y]==true) continue;// 如果当前节点为‘O',没遍历过,且在边上,那说明这次bfs遍历的所有'O'都不会被围住if(x==0||x==n-1||y==0||y==m-1){flag=false;}qu.push({x,y});sta[x][y]=true;}}// 没有被围住if(flag==false) return;// 被围住for(auto x:v){board[x.first][x.second]='X';}}void solve(vector<vector<char>>& board) {int n=board.size(),m=board[0].size();// 状态数组vector<vector<bool>> sta(n,vector<bool>(m,false));// 遍历所有元素for(int i=0;i<board.size();i++){for(int j=0;j<board[0].size();j++){// 没有被遍历过,且为‘O',并且不在边上if(sta[i][j]!=true&&board[i][j]=='O'&&i!=0&&j!=0&&i!=n-1&&j!=m-1){bfs(i,j,board,sta);}}}}
};
JAVA版本:
class Solution {void dfs(int x,int y,char[][] board,boolean[][] sta){if(x<0 ||y<0||x>=board.length||y>=board[0].length) return ;// 遍历过if(sta[x][y]==true) return;// 不为‘O'if(board[x][y]=='X') return ;sta[x][y]=true;dfs(x-1,y,board,sta);dfs(x+1,y,board,sta);dfs(x,y+1,board,sta);dfs(x,y-1,board,sta);}public void solve(char[][] board) {int n=board.length,m=board[0].length;// 状态数组boolean[][] sta=new boolean[n][m];// 遍历所有边上的节点for(int j=0;j<m;j++){if(sta[0][j]==false && board[0][j]=='O'){dfs(0,j,board,sta);}if(sta[n-1][j]==false && board[n-1][j]=='O'){dfs(n-1,j,board,sta);}}for(int i=0;i<n;i++){if(sta[i][0]==false && board[i][0]=='O'){dfs(i,0,board,sta);}if(sta[i][m-1]==false && board[i][m-1]=='O'){dfs(i,m-1,board,sta);}}// 将围住的节点都改为‘X’for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(sta[i][j]==false){board[i][j]='X';}}}}
}
GO版本:
func solve(board [][]byte) {n,m:=len(board),len(board[0])// 遍历所有边上的节点for i:=0;i<n;i++ {dfs(i,0,board)dfs(i,m-1,board)}for j:=0;j<m;j++ {dfs(0,j,board)dfs(n-1,j,board)}for i:=0;i<n;i++ {for j:=0;j<m;j++ {// 没有被围住if board[i][j]=='C' {board[i][j]='O'}else if board[i][j]=='O' {// 被围住board[i][j]='X'}}}
}
func dfs(x,y int,board [][]byte) {if x<0||y<0||x>=len(board)||y>=len(board[0]) || board[x][y]!='O' {return }// 将没有被围住的‘O’都改为‘C'board[x][y]='C'dfs(x-1,y,board);dfs(x+1,y,board);dfs(x,y-1,board);dfs(x,y+1,board);
}