Surrounded Regions leetcode java
题目:
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 题解:
这道题是说一个O周围都是X那么这个O就得变成X。那么就可以发现四周这一圈如果有O肯定不能四周都被X包围,同时这个O也将会是潜在的内部的O的缺口,
让内部的O不能都被X覆盖。因此,思路就是先对四周的O进行特殊处理,用BFS走,把所有这个O连接的O(包括这个O)都涂成#。这样子,对于原来的棋盘来说,
没有变成#的O就是四周没有被O污染的,四周都是X,那么对其变成X。而所有#就是那些原来是O但是不是四周都被X包围的,把它们再还原成O。 代码如下:
1 public void solve(char[][] board) {
2 if(board==null || board.length<=1 || board[0].length<=1)
3 return;
4
5 //第一行和最后一行进行fill
6 for(int i=0;i<board[0].length;i++){
7 fill(board,0,i);
8 fill(board,board.length-1,i);
9 }
//第一列和最后一列进行fill
for(int i=0;i<board.length;i++){
fill(board,i,0);
fill(board,i,board[0].length-1);
}
//对于当前格子中,所有O变成X(说明符合要求,没有被变成#),所有#变成O
for(int i=0;i<board.length;i++){
for(int j=0;j<board[0].length;j++){
if(board[i][j]=='O')
board[i][j]='X';
else if(board[i][j]=='#')
board[i][j]='O';
}
}
}
private void fill(char[][] board, int i, int j){
if(board[i][j]!='O')
return;
board[i][j] = '#';
//利用BFS
LinkedList<Integer> queue = new LinkedList<Integer>();
//先将矩阵的横纵坐标编码
int code = i*board[0].length+j;
queue.add(code);
while(!queue.isEmpty()){
code = queue.poll();
int row = code/board[0].length;//从code中还原横坐标
int col = code%board[0].length;//从code中还原纵坐标
if(row>=1 && board[row-1][col]=='O'){//当前元素上边是否为0
queue.add((row-1)*board[0].length + col);
board[row-1][col]='#';
}
if(row<=board.length-2 && board[row+1][col]=='O'){//当前元素下面是否为0
queue.add((row+1)*board[0].length + col);
board[row+1][col]='#';
}
if(col>=1 && board[row][col-1]=='O'){//当前元素左边是否为0
queue.add(row*board[0].length + col-1);
board[row][col-1]='#';
}
if(col<=board[0].length-2 && board[row][col+1]=='O'){//当前元素右边是否为0
queue.add(row*board[0].length + col+1);
board[row][col+1]='#';
}
}
}
Reference:http://blog.csdn.net/linhuanmars/article/details/22904855
Surrounded Regions leetcode java的更多相关文章
- Surrounded Regions——LeetCode
Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...
- Surrounded Regions - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 https://leetcode.com/problems/surrounded-regions/ 注意点 边缘不算包围'O' 解法 解法一:dfs.找处 ...
- [LeetCode] Surrounded Regions 包围区域
Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...
- 验证LeetCode Surrounded Regions 包围区域的DFS方法
在LeetCode中的Surrounded Regions 包围区域这道题中,我们发现用DFS方法中的最后一个条件必须是j > 1,如下面的红色字体所示,如果写成j > 0的话无法通过OJ ...
- 【LeetCode】130. Surrounded Regions (2 solutions)
Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...
- LeetCode: Surrounded Regions 解题报告
Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...
- Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)
Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O) ...
- [LeetCode] 130. Surrounded Regions 包围区域
Given a 2D board containing 'X' and 'O'(the letter O), capture all regions surrounded by 'X'. A regi ...
- 【leetcode】Surrounded Regions
Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...
随机推荐
- POJ - 1329 Circle Through Three Points 求圆
Circle Through Three Points Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4112 Acce ...
- 四、django rest_framework源码之频率控制剖析
1 绪言 权限判定之后的下一个环节是访问频率控制,本篇我们分析访问频率控制部分源码. 2 源码分析 访问频率控制在dispatch方法中的initial方法调用check_throttles方法开始. ...
- python 与 mongodb的交互
- [leetcode tree]100. Same Tree
判断输入的两棵树是不是相同 判断当前root值,左子树和右子树是否相同 ####注意最后用的是 is 而不是 ==,因为最后判断p和q是不是None, 应该判断是不是同一个对象 class Solut ...
- kolla部署all-in-one环境(N版)
简单介绍: Kolla 是 OpenStack 大帐篷模式下的官方子项目之一,其主要目标是通过利用 Docker 容器以及 Ansible 自动化部署工具,来为 OpenStack 云平台提 供一个简 ...
- wpf企业应用之数据校验
wpf中使用IDataErrorInfo实现数据校验,绑定实体需要实现了此接口,并在UI绑定表达式中添加ValidatesOnDataErrors=True,这样数据校验发生时,wpf会调用该接口中的 ...
- POJ2104 K-th Number 不带修改的主席树 线段树
http://poj.org/problem?id=2104 给定一个序列,求区间第k小 通过构建可持久化的点,得到线段树左儿子和右儿子的前缀和(前缀是这个序列从左到右意义上的),然后是一个二分的ge ...
- 【set】【multiset】Codeforces Round #484 (Div. 2) D. Shark
题意:给你一个序列,让你找一个k,倘若把大于等于k的元素都标记为不可用,那么剩下的所有元素形成的段的长度相同,并且使得段的数量尽量大.如果有多解,输出k尽量小的. 把元素从大到小排序插回原位置,用一个 ...
- OD基本汇编指令
jmp ;无条件跳转 指哪飞哪 一些杂志中说的直飞光明顶,指的就是它了~ 光明顶一般指爆破地址根据条件跳转的指令:JE ;等于则跳转 JNE ;不等于则跳转 JZ ;为 0 则跳转 JNZ ;不为 ...
- 20162327WJH使用队列:模拟票务站台代码分析
20162327WJH使用队列:模拟票务站台代码分析 用链队实现队列的情况 1.用链表实现队列的代码 关键方法代码及补全代(LinkedOueue类) public void enqueue(T el ...