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

LeetCode -- Surrounded Regions

题目描述:
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 X
X O O X
X X O X
X O X X
After running your function, the board should be:


X X X X
X X X X
X X X X
X O X X


在由'X'和'O'组成的矩阵中,找出所有被'X'包围的'O',将它们替换为'X'。


思路:
1.本题可以DFS也可以BFS,但是DFS速度会慢一些,无法通过测试数据。无论哪种方式,就是从四个边的'O'作为切入点n(如果BFS,需要先将四个边的'O'入队列),遍历时找到n的上下左右邻居,分别进行标记(假设标记为A),凡是标记为A的点即为:不能被围的'O',以这些邻居为中心继续下一次标记。
2.然后对board做一个遍历,把剩余的'O'赋值为'X',而'A'赋值为'O'即可。


实现代码:


public class Solution {
    public void Solve(char[,] board) 
    {
       	var row = board.GetLength(0);
    	var col = board.GetLength(1);
    	
    	if(row < 2 || col < 2){
    		return;
    	}
    	
    	// try go from left & right boundary
    	var q = new Queue<Pos>();
    	for(var i = 0;i < row; i++){
    		if(board[i , 0] == 'O'){
    			q.Enqueue(new Pos(i , 0));
    		}
    		if(board[i , col - 1] == 'O'){
    			q.Enqueue(new Pos(i , col - 1));
    		}
    	}
    	
    	// try go from top & down boundary
    	for(var i = 0;i < col; i++){
    		if(board[0,i] == 'O'){
    			q.Enqueue(new Pos(0 , i));
    		}
    		if(board[row - 1 , i] == 'O'){
    			q.Enqueue(new Pos(row - 1 , i));
    		}
    	}
    	Bfs(ref board, row, col , q);
    	
    	// restore 'A' to 'O'
    	// mark 'O' to 'X'
    	for(var i = 0;i < row; i++){
    		for(var j = 0;j < col; j++){
    			if(board[i,j] == 'O'){
    				board[i,j] = 'X';
    			}
    			if(board[i,j] == 'A'){
    				board[i,j] = 'O';
    			}
    		}
    	}
    }




private void Bfs(ref char[,] board, int rowLen, int colLen, Queue<Pos> q)
{
	if(q.Count == 0){
		return;
	}
	
	var q1 = new Queue<Pos>();
	while(q.Count > 0){
		var p = q.Dequeue();
		board[p.row, p.col] = 'A';
		
		// move up
		if(p.row > 0 && board[p.row - 1, p.col] == 'O'){
			q1.Enqueue(new Pos(p.row - 1, p.col));	
		}
		// move down
		if(p.row < rowLen - 1 && board[p.row + 1, p.col] == 'O'){
			q1.Enqueue(new Pos(p.row + 1, p.col));
		}
		// move right
		if(p.col < colLen - 1 && board[p.row, p.col + 1] == 'O'){
			q1.Enqueue(new Pos(p.row, p.col + 1));
		}
		// move left
		if(p.col > 0 && board[p.row, p.col - 1] == 'O'){
			q1.Enqueue(new Pos(p.row, p.col - 1));
		}
	}
	
	Bfs(ref board, rowLen, colLen, q1);
}


class Pos{
	public Pos(int r, int c){
		row = r;
		col = c;
	}
	
	public int row;
	public int col;
}


}


相关文章:

  • LeetCode -- Triangle
  • Nebula3中的骨骼动画: Animation子系统
  • LeetCode -- Ugly Number II
  • LeetCode -- Ugly Number
  • vim 显示行号、语法高亮、自动缩进的设置
  • LeetCode -- Linked List cycle
  • 根据textbox中的值,改变dropdownlist的选项
  • LeetCode -- Basic Calculator II
  • 完整SQL分页存储过程(支持多表联接)
  • LeetCode -- Bitwise AND of Numbers Range
  • C 符号列表
  • LeetCode -- Linked List Cycle II
  • LeetCode -- LRU Cache
  • [Web 开发] 定制IE下载对话框的按钮(打开/保存)
  • LeetCode -- Min Stack
  • Angular 响应式表单之下拉框
  • Babel配置的不完全指南
  • create-react-app做的留言板
  • Docker容器管理
  • IDEA 插件开发入门教程
  • JavaScript设计模式与开发实践系列之策略模式
  • jquery cookie
  • maya建模与骨骼动画快速实现人工鱼
  • Node项目之评分系统(二)- 数据库设计
  • PermissionScope Swift4 兼容问题
  • vue-cli3搭建项目
  • 聚簇索引和非聚簇索引
  • 悄悄地说一个bug
  • 使用API自动生成工具优化前端工作流
  • 探索 JS 中的模块化
  • 为什么要用IPython/Jupyter?
  • 我的面试准备过程--容器(更新中)
  • 一道面试题引发的“血案”
  •  一套莫尔斯电报听写、翻译系统
  • AI算硅基生命吗,为什么?
  • UI设计初学者应该如何入门?
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #define 用法
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (4.10~4.16)
  • (ZT)薛涌:谈贫说富
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转) ns2/nam与nam实现相关的文件
  • (转)socket Aio demo
  • (转)菜鸟学数据库(三)——存储过程
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .apk文件,IIS不支持下载解决