zoukankan      html  css  js  c++  java
  • DFS+并查集思想求被围绕的区域

    class Solution {
        private int[][] dir= {{0,-1},{-1,0},{0,1},{1,0}};
        private boolean[][] used;
        public boolean isMove(char[][] board,int x,int y)
        {
            if(x>=0&&x<board.length&&y>=0&&y<board[0].length)
            return true;
            return false;
        }
        
        public boolean dfs(char[][] board,int x,int y)
        {
            board[x][y]='*';   //一旦发现为立即赋值
            used[x][y]=true;   //并设为已访问
            for(int i=0;i<4;++i)
            {
                int newX=x+dir[i][0];
                int newY=y+dir[i][1];
                if(isMove(board,newX,newY)&&board[newX][newY]=='o'&&!used[newX][newY]&&dfs(board,newX,newY))
                {
                    return true;
                }
            }
            return false;
        }
        //并查集思想==找到一个点并把与它相关的点都标记起来再按这个标记做相应的处理
        public void solve(char[][] board) {
            used=new boolean[board.length][board[0].length];
            for(int i=0;i<board[0].length;++i)    //进行地图上下边的检索-->一旦发现有0则立即调用dfs将与它相关的0全部做好标记
            {
                if(board[0][i]=='o')
                    dfs(board,0,i);
                if(board[board.length-1][i]=='o')
                    dfs(board,board.length-1,i);
            }
            for(int i=0;i<board.length;++i)       //进行地图左右边的检索-->一旦发现有0则立即调用dfs将与它相关的0全部做好标记
            {
                if(board[i][0]=='o')
                    dfs(board,i,0);
                if(board[i][board[0].length-1]=='o')
                    dfs(board,i,board[0].length-1);
            }
            
            for(int i=0;i<board.length;++i)    
            {
                for(int j=0;j<board[0].length;++j)
                {
                    if(board[i][j]=='*')//对标记进行处理---->如果是已标记的说明是不可行的则立即将它进行赋值为x
                        board[i][j]='o';
                    else if(board[i][j]=='o')//对标记进行处理---->如果是已标记的说明是不可行的则立即将它进行赋值为0
                        board[i][j]='x';
                }
            }
            
            for(int i=0;i<board.length;++i)
            {
                for(int j=0;j<board[0].length;++j) {
                    System.out.print(board[i][j]);    //将处理好的地图进行输出---->检验算法的正确性
                }
                System.out.println();
            }
        }
    }
    
    
    public class Main {
        public static void main(String[] args) {
          Solution space=new Solution();
          char[][]board= {
                  {'x','x','o','x','x'},
                  {'x','x','x','x','x'},
                  {'x','x','x','x','x'},
                  {'x','o','o','x','x'},
                  {'x','x','o','x','x'},
                  {'x','o','x','x','x'}
        };
       space.solve(board);
     }
    }
  • 相关阅读:
    举例一个IO多路复用的C/S例子
    简单介绍协程
    生产者消费者模型
    多进程介绍
    有关多线程(同步锁,递归锁,同步对象,信号量)
    threading多线程模块
    开发一个支持多用户在线的FTP程序
    NTP时间服务器与客户端
    EF之增删改查
    返回新插入的数据的主键ID
  • 原文地址:https://www.cnblogs.com/z2529827226/p/11731487.html
Copyright © 2011-2022 走看看