surrounded regions
来源:互联网 发布:游族网络股票千股千评 编辑:程序博客网 时间:2024/06/16 07:55
题目描述
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,沿着它的四个方向找一条到O的路径,如果能够到达边缘的O,则说明它不是被X包围的。对于边缘的O一定不是被X包围的。
解法一:DFS
public class Solution5 { public void solve(char[][] board) { for(int i=0; i<board.length;++i){ for(int j=0;j<board[i].length;++j){ if((i==0 || i == board.length-1 || j==0|| j==board[i].length-1) && board[i][j]=='O'){//注意这个条件判断,我们需要从数组边缘开始找,如果找到,则沿着四个方向DFS solveDFS(board, i, j); } } } for (int i = 0; i < board.length; ++i) { for (int j = 0; j < board[i].length; ++j) { if (board[i][j] == 'O') board[i][j] = 'X'; if (board[i][j] == '$') board[i][j] = 'O'; } } for(int i=0; i<board.length;++i){ for(int j=0;j<board[i].length;++j){ System.out.println(board[i][j]); } } } private void solveDFS(char[][] board, int i, int j) { if (board[i][j] == 'O') { board[i][j] = '$';//将不被包围的'O'用'$'代替 if(i>0 && board[i-1][j] == 'O') solveDFS(board, i-1, j); if(j<board[i].length-1 && board[i][j+1]=='O') solveDFS(board, i, j+1); if(i<board.length-1 && board[i+1][j] == 'O') solveDFS(board, i+1, j); if(j>0 && board[i][j-1]=='O') solveDFS(board, i, j-1); } } public static void main(String[] args) { char[][] board = { {'X', 'X', 'X','X'}, {'X', 'O', 'O' ,'X'}, {'X', 'X', 'O', 'X'}, {'X' ,'O' ,'X' ,'X'} }; new Solution5().solve(board); }}
解法二:BFS
import java.util.HashMap;import java.util.LinkedList;import java.util.Map;import java.util.Queue;import javax.management.Query;public class Solution5_1 { public void solve(char[][] board){ int row = board.length;//数组的行数 if(row==0){//board={},避免报空指针异常 return; } int col = board[0].length;//数组的列数 Queue queue = new LinkedList<Pair>(); boolean[][] b = new boolean[row][col];//b[i][j]=true表示(i,j)为'O'并且不被包围 //从第一行遍历 for(int j=0;j<col;j++) if(board[0][j]=='O'){ queue.add(new Pair(0,j)); b[0][j] = true; } //第一列 for(int j=0;j<row;j++){ if(board[j][0] == 'O'){ queue.add(new Pair(j,0)); b[j][0] = true; } } //最后一行 for(int j=0;j<col;j++){ if(board[row-1][j] == 'O'){ queue.add(new Pair(row-1,j)); b[row-1][j] = true; } } //最后一列 for(int j=0;j<row;j++){ if(board[j][col-1] == 'O'){ queue.add(new Pair(j,col-1)); b[j][col-1] = true; } } while(!queue.isEmpty()){ Pair pair = (Pair) queue.poll(); int i = pair.getI(); int j = pair.getJ(); if(i-1>0 && board[i-1][j]=='O' && b[i-1][j]==false){ b[i-1][j]=true; queue.add(new Pair(i-1,j)); } if(i+1<row-1 && board[i+1][j]=='O' && b[i+1][j]==false){ b[i+1][j]=true; queue.add(new Pair(i+1,j)); } if(j-1>0 && board[i][j-1]=='O' && b[i][j-1]==false){ b[i][j-1]=true; queue.add(new Pair(i,j-1)); } if(j+1<col-1 && board[i][j+1]=='O'&& b[i][j+1]==false){ b[i][j+1]=true; queue.add(new Pair(i,j+1)); } } //Get result for (int i=0;i<row;i++){ for (int j=0;j<col;j++){ if (board[i][j]=='O' && b[i][j]==false){ board[i][j]='X'; } } } for(int i=0; i<board.length;++i){ for(int j=0;j<board[i].length;++j){ System.out.println(board[i][j]); } } } class Pair{ public int i; public int j; public Pair(int i, int j){ this.i=i; this.j=j; } public int getI(){ return this.i; } public int getJ(){ return this.j; } } public static void main(String[] args) { char[][] board = { {'X', 'X', 'X','X'}, {'X', 'O', 'O' ,'X'}, {'X', 'X', 'O', 'X'}, {'X' ,'O' ,'X' ,'X'} }; new Solution5_1().solve(board); }}
0 0
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- java 中的序列化是什么意思?有什么好处?
- 串口应用程序
- 【知识必备】浅淡MVP在Android项目中的实战演习,让代码结构更简单~
- CSU
- Spark 控制输出信息等级
- surrounded regions
- [Leetcode] 108. Convert Sorted Array to Binary Search Tree 解题报告
- idea的svn操作时报Server ssl certificate rejected错误
- AutoCompleteTextView默认首次失去焦点
- 小总结之Android知识点(1)
- python自动化测试应用-第3篇(APP测试)--Appium元素篇
- web端开发常用工具总结
- 移动端web开发技巧
- 新的开始,新的征程,出发!