477

来源:互联网 发布:猿题库数据从何来 编辑:程序博客网 时间:2024/05/22 00:47

2017.9.4

利用栈,对OOOOOO的区域进行广度有限的遍历,也就是说找到相连的一片区域,将这若干个结点作为一个整体统一处理。

如果这些节点中,有一个节点是边界节点,那么 needChange就为false,意思是不需要进行修改。

我觉得这种整体的思想要学会,比一个一个的处理要在逻辑上更为清晰一些。

check函数用来判断是不是边界节点。

public class Solution {    /**     * @param board a 2D board containing 'X' and 'O'     * @return void     */   public void surroundedRegions(char[][] board){if(board == null){return ;}// 行数int n = board.length;if(n <= 2){return ;}// 列数int m = board[0].length;if(m <=2){return ;}boolean [][]visit = new boolean[n][m];boolean [][]flag = new boolean[n][m];        for(int i = 0; i < n; i++){        for(int j = 0; j < m; j++){        if(board[i][j] == 'O' && visit[i][j] == false){        LinkedList<int[]> list = new LinkedList<int[]>();        LinkedList<int[]> res = new LinkedList<int[]>();        boolean needChange = true;// 判断这一组是不是需要改变        int []a = {i,j};        list.push(a);        visit[i][j] = true;        while(!list.isEmpty()){        int []b = list.pop();        res.push(b);        if(needChange == true){        // 如果发现没有包围住,则不需要改变        if(!check(board,b[0],b[1],visit)){        needChange = false;        }        }        if(isUp(b[0],b[1],visit,n,m,board)){        int []tmp = {b[0]-1,b[1]};        visit[b[0]-1][b[1]] = true;        list.push(tmp);        }        if(isDown(b[0],b[1],visit,n,m,board)){        int []tmp = {b[0]+1,b[1]};        visit[b[0]+1][b[1]] = true;        list.push(tmp);        }        if(isLeft(b[0],b[1],visit,n,m,board)){        int []tmp = {b[0],b[1]-1};        visit[b[0]][b[1]-1] = true;        list.push(tmp);        }        if(isRight(b[0],b[1],visit,n,m,board)){        int []tmp = {b[0],b[1]+1};        visit[b[0]][b[1]+1] = true;        list.push(tmp);        }        }                if(needChange == true){        while(!res.isEmpty()){        int []tmp = res.pop();        board[tmp[0]][tmp[1]] = 'X';        }        }        }        }        }    }// isUp,isDown,isRight,isLeft这四个函数用来判断,上下左右是不是还有相连的O。public boolean isUp(int i,int j,boolean [][]visit,int n,int m,char[][] board){if(i-1 >= 0 && board[i-1][j] == 'O' && visit[i-1][j] == false){return true;}elsereturn false;}public boolean isLeft(int i,int j,boolean [][]visit,int n,int m,char[][] board){if(j-1 >= 0 && board[i][j-1] == 'O' && visit[i][j-1] == false){return true;}elsereturn false;}public boolean isDown(int i,int j,boolean [][]visit,int n,int m,char[][] board){if(i+1 < n && board[i+1][j] == 'O' && visit[i+1][j] == false){return true;}elsereturn false;}public boolean isRight(int i,int j,boolean [][]visit,int n,int m,char[][] board){if(j+1 < m && board[i][j+1] == 'O' && visit[i][j+1] == false){return true;}elsereturn false;}public boolean check(char[][] board,int i,int j,boolean[][] visit){int n = board.length;int m = board[0].length;if(i*j == 0 || i == n -1 || j == m-1){return false;}return true;}}


原创粉丝点击