2021-10-14:被围绕的区域。给你一个 m x n 的矩阵 board ,由若干字符 ‘X‘ 和 ‘O‘ ,找到所有被 ‘X‘ 围绕的区域,并将这些区域里所有的 ‘O‘ 用 ‘X‘ 填充。力扣1
2021-10-14:被围绕的区域。给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。力扣130。
福大大 答案2021-10-14:
从四周边界开始感染,没感染到的区域,变成’X’。
时间复杂度:O(MN)。
空间复杂度:未知。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
if true {
board := [][]byte{{'X', 'X', 'X', 'X'}, {'X', 'O', 'O', 'X'}, {'X', 'X', 'O', 'X'}, {'X', 'O', 'X', 'X'}}
solve1(board)
for i := 0; i < len(board); i++ {
for j := 0; j < len(board[i]); j++ {
fmt.Printf("%c ", board[i][j])
}
fmt.Println("")
}
}
fmt.Println("---------")
if true {
board := [][]byte{{'X', 'X', 'X', 'X'}, {'X', 'O', 'O', 'X'}, {'X', 'X', 'O', 'X'}, {'X', 'O', 'X', 'X'}}
solve2(board)
for i := 0; i < len(board); i++ {
for j := 0; j < len(board[i]); j++ {
fmt.Printf("%c ", board[i][j])
}
fmt.Println("")
}
}
}
// // m -> 二维数组, 不是0就是1
// //
// public static void infect(int[][] m, int i, int j) {
// if (i < 0 || i == m.length || j < 0 || j == m[0].length || m[i][j] != 1) {
// return;
// }
// // m[i][j] == 1
// m[i][j] = 2;
// infect(m, i - 1, j);
// infect(m, i + 1, j);
// infect(m, i, j - 1);
// infect(m, i, j + 1);
// }
func solve1(board [][]byte) {
ans := make([]bool, 1)
for i := 0; i < len(board); i++ {
for j := 0; j < len(board[0]); j++ {
if board[i][j] == 'O' {
ans[0] = true
can(board, i, j, ans)
if ans[0] {
board[i][j] = 'T'
} else {
board[i][j] = 'F'
}
}
}
}
for i := 0; i < len(board); i++ {
for j := 0; j < len(board[0]); j++ {
can := board[i][j]
if can == 'T' || can == 'F' {
board[i][j] = '.'
change(board, i, j, can)
}
}
}
}
func can(board [][]byte, i int, j int, ans []bool) {
if i < 0 || i == len(board) || j < 0 || j == len(board[0]) {
ans[0] = false
return
}
if board[i][j] == 'O' {
board[i][j] = '.'
can(board, i-1, j, ans)
can(board, i+1, j, ans)
can(board, i, j-1, ans)
can(board, i, j+1, ans)
}
}
func change(board [][]byte, i int, j int, can byte) {
if i < 0 || i == len(board) || j < 0 || j == len(board[0]) {
return
}
if board[i][j] == '.' {
if can == 'T' {
board[i][j] = 'X'
} else {
board[i][j] = '0'
}
change(board, i-1, j, can)
change(board, i+1, j, can)
change(board, i, j-1, can)
change(board, i, j+1, can)
}
}
// 从边界开始感染的方法,比第一种方法更好
func solve2(board [][]byte) {
if len(board) == 0 || len(board[0]) == 0 {
return
}
N := len(board)
M := len(board[0])
for j := 0; j < M; j++ {
if board[0][j] == 'O' {
free(board, 0, j)
}
if board[N-1][j] == 'O' {
free(board, N-1, j)
}
}
for i := 1; i < N-1; i++ {
if board[i][0] == 'O' {
free(board, i, 0)
}
if board[i][M-1] == 'O' {
free(board, i, M-1)
}
}
for i := 0; i < N; i++ {
for j := 0; j < M; j++ {
if board[i][j] == 'O' {
board[i][j] = 'X'
}
if board[i][j] == 'F' {
board[i][j] = 'O'
}
}
}
}
func free(board [][]byte, i int, j int) {
if i < 0 || i == len(board) || j < 0 || j == len(board[0]) || board[i][j] != 'O' {
return
}
board[i][j] = 'F'
free(board, i+1, j)
free(board, i-1, j)
free(board, i, j+1)
free(board, i, j-1)
}
执行结果如下:

2021-10-14:被围绕的区域。给你一个 m x n 的矩阵 board ,由若干字符 ‘X‘ 和 ‘O‘ ,找到所有被 ‘X‘ 围绕的区域,并将这些区域里所有的 ‘O‘ 用 ‘X‘ 填充。力扣1的更多相关文章
- Noip模拟76 2021.10.14
T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...
- 日常Java 2021/10/14
Java数据结构 Java BitSet类 BitSet类创建一种特殊类型的数组来保存位值,数组大小随需要增加,BitSet(),BitSet(int size) 其中的方法 void and(Bit ...
- 1 - JVM随笔分类(java虚拟机的内存区域分配(一个不断记录和推翻以及再记录的一个过程))
java虚拟机的内存区域分配 在JVM运行时,类加载器ClassLoader在加载到类的字节码后,交由jvm的执行引擎处理, 执行过程中需要空间来存储数据(类似于Cpu及主存),此时的这段空间的分 ...
- 一个区域只能放置一个组件,如果想在一个区域放置多个组件就需要使用Panel来装载
五种布局管理器: Flow Layout(流式布局):按照组件添加到容器中的顺序,顺序排放组件位置.默认为水平排列,如果越界那么会向下排列.排列的位置随着容器大小的改变而改变. Panel默认的布局管 ...
- Noip模拟70 2021.10.6
T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...
- Noip模拟69 2021.10.5
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...
- 2021.11.14 CF1583E Moment of Bloom(LCA+图上构造)
2021.11.14 CF1583E Moment of Bloom(LCA+图上构造) https://www.luogu.com.cn/problem/CF1583E 题意: She does h ...
- 背水一战 Windows 10 (14) - 动画: 线性动画, 关键帧动画
[源码下载] 背水一战 Windows 10 (14) - 动画: 线性动画, 关键帧动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 线性动画 - ColorAnimatio ...
- Thinkpad W520 + Ubuntu 12.04LTS, 13.10, 14.04LTS安装Nvidia显卡驱动设置
Thinkpad W520 + Ubuntu 12.04LTS, 13.10, 14.04LTS安装Nvidia显卡驱动设置 http://henzhai.com/tech/2012/07/w520- ...
- macOS 10.14虚拟机安装教程
windows10下安装vmware14.0以及macOS 10.14图文详解 工具/原料 windows10 vmware 14.0 macOS 10.14懒人版 mac补丁unlocker工具 ...
随机推荐
- [picoCTF]Scavenger Hunt write up
http://mercury.picoctf.net:5080/,这个网站周围隐藏着一些有趣的信息.你能找到它吗? 根据提示: 您应该有足够的提示来查找文件,不要运行暴力破解程序. 点击链接,进入页面 ...
- vue 缓存后台获取的token
代码 localStorage.setItem("token",res.data.data);// 用localStorage缓存token值
- Qt 学习笔记 - 第五章 - Qt 时间编程 - Qt 时钟
原文地址:Qt 学习笔记 - 第五章 - Qt 时间编程 - Qt 时钟 Qt 学习笔记全系列传送门: Qt 学习笔记 - 第一章 - 快速开始.信号与槽 Qt 学习笔记 - 第二章 - 添加图片.布 ...
- CAS 6.x + Delegated Authentication SAML2.0 配置记录
最近领导派了一个活儿, 需要把我们CAS系统的身份识别交给甲方的系统, 甲方的系统是SAML2.0的协议. 由于之前对SAML2.0协议了解不多,折腾了不少时间,在这里记录一下.以后忘掉还可以看看. ...
- GUI编程--1
GUI编程--1 GUI是什么 (Graphical User Interface),即用户图形界面编程. 怎么玩 平时怎么运用 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 1.简介 ...
- 在基于vue-next-admin的Vue3+TypeScript前端项目中,为了使用方便全局挂载的对象接口
在基于vue-next-admin 的 Vue3+TypeScript 前端项目中,可以整合自己的 .NET 后端,前端操作一些功能的时候,为了使用方便全局挂载的对象接口,以便能够快速处理一些特殊的操 ...
- 在windows系统中设置MySQL数据库
MySQL搭建 效果图 step1:下载安装包 https://downloads.mysql.com/archives/community/ step2:解压后即完成安装 step3:创建 my.i ...
- fork语句遇见for循环语句
一.没有automatic的fork-join_none 通常小白会这么写: 代码如下: foreach(a[i]) begin fork repeat(a[i]) #1ns; $display(&q ...
- vue拖拽排序插件vuedraggable的使用 附原生使用方法
Vue中使用 先下载依赖: npm install vuedraggable -S 项目中引入 import draggable from 'vuedraggable' 注册 components: ...
- 二进制安装Kubernetes,一键安装脚本
背景,最近几天闲着研究Kubernetes,发现使用手动二进制安装会有些繁琐.经过突发奇想,就出现这个脚本. 声明,该脚本不及互联网上其他大佬的一件脚本,该脚本仅仅是突发奇想编写的,希望大佬不喜勿喷. ...