当前位置: 首页 > java >正文

(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);
}
http://www.xdnf.cn/news/20397.html

相关文章:

  • uni-app倒计时公共组件 封装,倒计时组件
  • 【Next】服务端接口
  • scikit-learn零基础配置(含python、anaconda)
  • 大电流场景首选:捷多邦解析厚铜 PCB 的应用优势
  • 【PCIe EP 设备入门学习专栏 -- 8.1.2 PCIe EP 通路详细介绍】
  • v0.29.1 敏感词性能优化之内部类+迭代器内部类
  • 中州养老项目:利用Redis解决权限接口响应慢的问题
  • Pandas基础(安装、导入Pandas、读取数据、查看数据)
  • 一、算法与数据结构的本质关系:灵魂、肉体与图书馆
  • 3、工厂模式
  • redis-----事务
  • SDRAM-08 数据手册解读
  • python系列之综合项目:智能个人任务管理系统
  • HTML标签之超链接
  • 《UE5_C++多人TPS完整教程》学习笔记48 ——《P49 瞄准偏移(Aim Offset)》
  • 【LeetCode热题100道笔记】二叉搜索树中第 K 小的元素
  • Flink-新增 Kafka source 引发状态丢失导致启动失败
  • 2.2 Web和Http
  • 从0死磕全栈第五天:React 使用zustand实现To-Do List项目
  • MySQL事务日志类型及作用解析
  • Eigen中Eigen::Affine3d和Eigen::Isometry3d详解
  • 得物前端二面面经总结
  • LeetCode_数学
  • 解析、创建Excel文件的开源库OpenXLSX介绍
  • ES06-SpringData集成
  • Valgrind检测内存泄漏入门指南
  • ClickHouse 中的物化列与物化视图
  • SpringBoot01-配置文件
  • 未来教育行业的 Go 服务开发解决方案与实践
  • 【PyTorch实战:Tensor】4、NumPy与PyTorch Tensor指南:深度学习中的数据操作与转换