01点阵地图,数出有多少个岛屿。

计数的一些岛屿。一个岛,四面环水,是通过连接相邻的土地横向或纵向的形成。你可以假设所有四个边的网格都是被水包围。

1.检测是否被访问过了,如果是设置成x,然后取到下一格。

2.检查是否为1,如果不是,把它设置成已经访问过的,为x。

3.发现每一个岛中的1,然后增加岛的数目numisland,

  去往从头开始的每个1,将它设置成已经访问过的,即设置成x

4.返回numisland。

时间复杂度为N,当n为矩阵的大小

空间复杂度为1,因为我们把它当作已访问的列表复用了矩阵。

 1     public class Solution {
 2
 3     private void discoverIsland(char[][] g, int h, int w, int x, int y)
 4     {
 5       if( x < 0 || y < 0 || x >= h || y >= w ) return;
 6
 7       if( g[x][y] == ‘x‘ || g[x][y] == ‘0‘ ) return;
 8
 9       g[x][y] = ‘x‘;
10
11       discoverIsland(g,h,w,x+1,y);
12       discoverIsland(g,h,w,x,y+1);
13       discoverIsland(g,h,w,x-1,y);
14       discoverIsland(g,h,w,x,y-1);
15     }
16
17     public int numIslands(char[][] grid) {
18
19       if( grid.length == 0 ) return 0;
20
21       int numIslands = 0;
22       int rows = grid.length;
23       int cols = grid[0].length;
24       for( int i=0; i<rows; i++ )
25       {
26           for( int j=0; j<cols; j++ )
27           {
28               if( grid[i][j] == ‘x‘ ) continue;
29
30               if( grid[i][j] == ‘1‘ )
31               {
32                   discoverIsland(grid, rows, cols, i, j);
33                   numIslands++;
34               }
35               else
36               {
37                   grid[i][j] = ‘x‘;
38               }
39           }
40       }
41
42       return numIslands;
43     }
44
45     }
public class Solution {
    void findIsland(char[][] grid, int x, int y, HashSet<Integer> used) {
        int tag = 0;
        int rows = grid.length;
        int columns = grid[0].length;
        // up
        if (x > 0 && grid[x - 1][y] == ‘1‘) {
            tag = (x - 1) * columns + y;
            if (!used.contains(tag)) {
                used.add(tag);
                findIsland(grid, x - 1, y, used);
            }
        }
        // right
        if ( y < (columns - 1) && grid[x][y + 1] == ‘1‘) {
            tag = x * columns + y + 1;
            if (!used.contains(tag)) {
                used.add(tag);
                findIsland(grid, x, y + 1, used);
            }
        }
        // down
        if (x < (rows - 1) && grid[x + 1][y] == ‘1‘) {
            tag = (x + 1) * columns + y;
            if (!used.contains(tag)) {
                used.add(tag);
                findIsland(grid, x + 1, y, used);
            }
        }
        // left
        if(y > 0 && grid[x][y - 1] == ‘1‘) {
            tag = x * columns + y - 1;
            if (!used.contains(tag)) {
                used.add(tag);
                findIsland(grid, x, y - 1, used);
            }
        }
    }

    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }
        int result = 0;
        int rows = grid.length;
        int columns = grid[0].length;
        HashSet<Integer> used = new HashSet<Integer>();
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < columns; ++j) {
                if (grid[i][j] == ‘1‘) {
                    int tag = i * columns + j;
                    if (!used.contains(tag)) {
                        used.add(tag);
                        result ++;
                        findIsland(grid, i, j, used);
                    }
                }
            }
        }
        return result;
    }
}

  

时间: 2024-10-08 19:35:18

01点阵地图,数出有多少个岛屿。的相关文章

Buy the souvenirs---hdu2126(01背包输出方案数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 有n个物品每个物品的价格是v[i],现在有m元钱问最多买多少种物品,并求出有多少种选择方法: 如果将物品的价格看做容量,将它的件数1看做价值的话,那么用01背包就可以求的花费m钱所能买到的最大件数dp[m]. 但是题目还要求方案数,因此很容易想到再建立一个数组f[j],存储j元钱能买dp[j]个物品的方案数. 在求解01背包的过程中,要分两种情况讨论: 设当前所选的物品为i 1.   若选了物

【智能手环APP for Android 】01 百度地图展示行动轨迹

1.效果图示 2.行动轨迹数据 <span style="font-size:18px;">[ { "LocationX":"121.42619", "LocationY":"31.186655" }, { "LocationX":"121.42694", "LocationY":"31.187215" }, { &

COJ 0036 数数happy有多少个?

数数happy有多少个? 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 图图是个爱动脑子.观察能力很强的好学生.近期他正学英语单词,练字时无意识地写了一串小写英文字母,他发现这串字母中包含了很多个happy,他决定计算一下到底有多少个happy.规则是这样的:在该字符串提取任意位置的字符组成新的单词串,不改变其在原字符串中的相对顺序,请你编写程序帮助图图统计出新的单词串种最多有多少个happy. 输入 输入只有一行,含有一

ios 一步一步学会自定义地图吹出框(CalloutView)--&gt;(百度地图,高德地图,google地图)

前言 在 ios上边使用地图库的同学肯定遇到过这样的问题:吹出框只能设置title和subtitle和左右的view,不管是百度地图还是高德地图还是自带的 google地图,只提供了这四个属性,如果想添加更多的view,只能自定义.可是,类库只能看到.h文件,.m都看不到,这让新手比较蛋疼,庞大的地 图类库一时半会摸不着头脑,从头再学还需要时间,本文就教大家快速制作一个属于自己的 CalloutView!等你一步一步调通后,再回过头来使用系统自带的方法设置callout,就会领悟这个过程. 正文

【实数系统】 01 - 万物皆数

1.2.3.……,自然数就好像是大自然的母语,它独立于人的思维而存在,甚至很多动物都会简单的计数.考古学有足够的证据表明,远远早于人类文明之前,人们就开始有意识的计数了.到了古希腊时期,以各种政治宗教团体为代表,人们对知识的认知达到了空前的程度,其中影响最大的当属“毕达哥拉斯学派”.毕达哥拉斯曾求学于古希腊圣贤,并游历了周边世界,回国后创办了学派.关于“毕达哥拉斯学派”的故事数不胜数,网络和史书上都有精彩的描述,这里就不多说了.值得一提的是该学派的信条“万物皆数”,这里的数就是指自然数,当然还包

洛谷 P1064 金明的预算方案【DP/01背包-方案数】

题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩M元(M<=10000). 餐馆虽低端,但是菜品种类不少,有N种(N<=100),第i种卖ai元(ai<=1000).由于是很低端的餐馆,所以每种菜只有一份. 小A奉行"不把钱吃光不罢休",所以他点单一定刚好吧uim身上所有钱

c语言编程1×2×3×……×n所得的数末尾有多少0

尾数为0主要抓住相乘数字中的末尾是5和0的数值,一个5就可以和一个2或4相乘得到一个末尾是0的数,所以只要计算有多少末尾是5或0的数字就好:当然25.125之类的数字又可以分为5×5.5×5×5,所以25要当两个5看待:代码如下#include <stdio.h>int main(){int n,i,j,sum=0;printf("请输出一个数:\n");scanf("%d",&n);for(i=1;i<=n;i++){j=i;//whil

ELK收集nginx日志并用高德地图展示出IP

(一)测试的环境 agentd:192.168.180.22 ES:192.168.180.23 kibana:192.168.180.23 采用的拓扑:logstash -->ES-->kibana (二)实施步骤: (1)logstsh具体配置: 1,配置nginx日志格式,采用log_format格式: log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '          

数长方形有多少个?POJ(1693)

题目链接:http://poj.org/problem?id=1693 解题报告: 随机选两根横的,再找一下与这两根横线相交的竖线有多少根,m,那么就有(m-1)*m/2个长方形. #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; const int maxn = 100; struct line { int