zoukankan      html  css  js  c++  java
  • Number of Islands

    Description

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/number-of-islands
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    ——————————————————————————————

     深搜,当遇到一个没有被标记的“1”时,以此为起点,标记,继续往这个方向搜索,遇到“1”时,重复上述操作,直到此方向上没有相邻的“1”,换个方向,当当前的“1”的周围并没有相邻的“1”时,回溯到上一个“1”,换个方向,继续。。。

    可以看到,其实就是一个操作,不断重复,所以很显然可以用递归的方法来做(废话,深搜不是递归还是啥。。。)

    下面上代码:

    class Solution {
        static int[] dx = {-1, 1, 0, 0};
        static int[] dy = {0, 0, -1, 1};
        public int numIslands(char[][] grid) {
            int rows = grid.length;
            if(rows == 0){
                return 0;
            }
            int cols = grid[0].length;
            int counts = 0;
            boolean[][] visited = new boolean[rows][cols];
            for(int i = 0; i < rows; i++){
                for(int j = 0; j < cols; j++){
                    if(!visited[i][j] && grid[i][j] == '1'){
                        counts++;
                        DFS(grid, visited, i, j);
                    }
                }
            }
            return counts;
        }
    
        public static void DFS(char[][] grid, boolean[][] visited, int x, int y){
            int rows = grid.length;
            int cols = grid[0].length;
            for(int i = 0; i < 4; i++){
                int r = x + dx[i];
                int c = y + dy[i];
                if(r >= 0 && r < rows && c >= 0 && c < cols){
                    if(!visited[r][c] && grid[r][c] == '1'){
                        visited[r][c] = true;
                        DFS(grid, visited, r, c);
                    }
                }
            }
    
        }
    }

     试了一下广搜,好像也是可以的

    class Solution {
        static int[] dx = {-1, 1, 0, 0};
        static int[] dy = {0, 0, -1, 1};
        static class Node{
            int x, y;
        };
        public int numIslands(char[][] grid) {
            int rows = grid.length;
            if(rows == 0){
                return 0;
            }
            int cols = grid[0].length;
            int counts = 0;
            for(int i = 0; i < rows; i++){
                for(int j = 0; j < cols; j++){
                    if(grid[i][j] == '1'){
                        Node n = new Node();
                        n.x = i;
                        n.y = j;
                        grid[i][j] = '0';
                        BFS(n, grid);
                        counts++;
                    }
                }
            }
            return counts;
        }
    
        public static void BFS(Node n, char[][] grid) {
            int rows = grid.length, cols = grid[0].length;
            Node[] queue = new Node[rows*cols];
            int head = 0, tail = 0;
            queue[tail++] = n;
            while(head < tail) {
                Node node = queue[head++];
                for(int i = 0; i < 4; i++) {
                    int x = node.x + dx[i];
                    int y = node.y + dy[i];
                    if(x >= 0 && x < rows && y >= 0 && y < cols) {
                        if(grid[x][y] == '1') {
                            Node nd = new Node();
                            nd.x = x;
                            nd.y = y;
                            queue[tail++] = nd;
                            grid[x][y] = '0';
                        }
                    }
                }
            }
        }
    }

    但是为甚么我觉得我写的广搜其实就是深搜,囧..

  • 相关阅读:
    魔兽争霸RPG地图开发教程2
    魔兽争霸RPG地图开发教程1
    php mysql decimal 多余的0 解决方案
    windows下创建子进程过程中代码重复执行问题
    python多进程的理解 multiprocessing Process join run
    进程和线程的概念、区别和联系
    Python中的魔术方法详解(双下方法)
    socketserver源码剖析
    Socketserver详解
    全网最详细python中socket套接字send与sendall的区别
  • 原文地址:https://www.cnblogs.com/WakingShaw/p/12971349.html
Copyright © 2011-2022 走看看