题目2 : 岛屿

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给你一张某一海域卫星照片,你需要统计:

1. 照片中海岛的数目

2. 照片中面积不同的海岛数目

3. 照片中形状不同的海盗数目

其中海域的照片如下,"."表示海洋,"#"表示陆地。在"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。

.####..
.....#.
####.#.
.....#.
..##.#.

上图所示的照片中一共有4座岛屿;其中3座面积为4,一座面积为2,所以不同面积的岛屿数目是2;有两座形状都是"####",所以形状不同的岛屿数目为3。

输入

第一行包含两个人整数:N 和 M,(1 ≤ NM ≤ 50),表示照片的行数和列数。

以下一个 N * M 的矩阵,表示表示海域的照片。

输出

输出3个整数,依次是照片中海岛的数目、面积不同的海岛数目和形状不同的海岛数目。

样例输入
5 7
.####..
.....#.
####.#.
.....#.
..##.#.
样例输出
4 2 3

思路:

深搜,搜索过的岛屿,置岛屿为x,并用一个area数组记录,搜索到的岛的面积的大小。面积不同的岛屿,通过岛屿的位置,hash出一个值,利用set的去重功能,最后判断sharp数组中有多少个元素。

注意:关于hash的时候,hash取值,我用84的时候re了,,,91AC了,猜测可能素数的效果更好一些。

AC代码:

 #include <stdio.h>
#include <set>
using namespace std; char s[][];
int N, M;
int di[] = {, -, , };
int dj[] = {, , , -};
set<int> area, shape; int dfs(int i, int j, int *mini, int *minj, int *maxi, int *maxj) {
if (i < *mini)
*mini = i;
if (i > *maxi)
*maxi = i;
if (j < *minj)
*minj = j;
if (j > *maxj)
*maxj = j;
s[i][j] = 'x';
int a = ;
for (int d = ; d < ; ++d) {
int ni = i + di[d], nj = j + dj[d];
if (s[ni][nj] == '#')
a += dfs(ni, nj, mini, minj, maxi, maxj);
}
return a;
} int mhash(int mini, int minj, int maxi, int maxj) {
int k = , sh = ;
for (int i = mini; i <= maxi; ++i) {
for (int j = minj; j <= maxj; ++j) {
sh = sh * k + s[i][j];
}
k*=;
}
return sh;
} int main() {
scanf("%d%d", &N, &M);
for (int i = ; i < N; ++i)
scanf("%s", s[i + ] + );
int n1 = ;
for (int i = ; i <= N; ++i)
for (int j = ; j <= M; ++j)
if (s[i][j] == '#') {
n1++;
int mini = i, maxi = i, minj = j, maxj = j;
area.insert(dfs(i, j, &mini, &minj, &maxi, &maxj));
shape.insert(mhash(mini, minj, maxi, maxj));
}
printf("%d %d %d", n1, area.size(), shape.size());
return ;
}

hiho #1310 : 岛屿 (dfs,hash)的更多相关文章

  1. hihocoder 1310 岛屿

    #1310 : 岛屿 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给你一张某一海域卫星照片,你需要统计: 1. 照片中海岛的数目 2. 照片中面积不同的海岛数目 3. ...

  2. hihoCoder1310 岛屿 (dfs)

    思路:首先dfs求得所有联通块,再搜索的同时把每个联通块的坐标都保存下来,然后把每个联通块处理一下–首先得到某个联通块的最小横坐标和纵坐标,然后让每个坐标去减去这个横坐标和纵坐标.相当于使得所有联通块 ...

  3. poj 1186 方程的解数【折半dfs+hash】

    折半搜索,map会T所以用hash表来存状态 #include<iostream> #include<cstdio> #include<map> using nam ...

  4. hdu 4277 USACO ORZ dfs+hash

    USACO ORZ Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Proble ...

  5. hiho 1564 - 简单dfs + 宏的危害!!!

    题目链接 H公司有 N 台服务器,编号1~N,组成了一个树形结构.其中中央服务器处于根节点,终端服务器处于叶子节点. 中央服务器会向终端服务器发送消息.一条消息会通过中间节点,到达所有的终端服务器.消 ...

  6. 算法之dfs篇

    dfs算法是深度搜索算法.从某一节点开始遍历直至到路径底部,如果不是所寻找的,则回溯到上个节点后,再遍历其他路径.不断重复这个过程.一般此过程消耗很大,需要一些优化才能保持算法的高效. hdu1010 ...

  7. HDU 6599 I Love Palindrome String (回文树+hash)

    题意 找如下子串的个数: (l,r)是回文串,并且(l,(l+r)/2)也是回文串 思路 本来写了个回文树+dfs+hash,由于用了map所以T了 后来发现既然该子串和该子串的前半部分都是回文串,所 ...

  8. 305. 岛屿数量 II

    题目: 假设你设计一个游戏,用一个 m 行 n 列的 2D 网格来存储你的游戏地图. 起始的时候,每个格子的地形都被默认标记为「水」.我们可以通过使用 addLand 进行操作,将位置 (row, c ...

  9. Uva 10118 免费糖果

    题目链接:https://uva.onlinejudge.org/external/101/10118.pdf 参考:http://www.cnblogs.com/kedebug/archive/20 ...

随机推荐

  1. cocos2d 3.6 win7下的配置

    我搭建cocos2.6的开发环境需要安装工具包括: 1.Visual Studio 2012(由于不兼容win7,需要安装Update 4)和虚拟光驱daemon tool,虚拟光驱的下载地址:htt ...

  2. JavaScript排序算法——快速排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 最好用的placeholder插件,jQuery插件EnPlaceholder

    EnPlaceholder插件支持密码框哦!实际对比同类的placeholder插件在ie等浏览器下效果做好! 插件效果预览:http://www.wufangbo.com/demo/jquery/3 ...

  4. Tween + 缓动函数

    Unity-Tween http://www.cnblogs.com/MrZivChu/p/UnityTween.html iTween: iTween大解构(一)之抛物线移动 http://blog ...

  5. Java中关于HashMap的元素遍历的顺序问题

    Java中关于HashMap的元素遍历的顺序问题 今天在使用如下的方式遍历HashMap里面的元素时 1 for (Entry<String, String> entry : hashMa ...

  6. SpringMVC -rest风格修改删除

    REST风格

  7. Java Runtime.availableProcessors()方法

    Java Runtime.availableProcessors()方法用法实例教程.   描述 java.lang.Runtime.availableProcessors() 方法返回到Java虚拟 ...

  8. c#之Redis队列

    摘要 这两天一直在考虑redis队列:一个生产者,多个消费者的情况,这里弄了一个demo进行测试. 一个例子 关于如何引用Redisclient 可以参考之前的这篇文章:c#之Redis实践list, ...

  9. ajava包的命名

    2. Package的命名 Package名的第一部分应是小写ASCII字符,并且是顶级域名之一,通常是com.edu.gov.mil.net.org或由ISO标准3166.1981定义的国家唯一标志 ...

  10. php 关于时区 date gmdate date_default_timezone_set/get 终极答疑

    关于GMT和UTC时间? GMT+0800 Greenwich: [gri:nitf], 格林威治/格林尼治.是英国伦敦泰晤士河附近的一个小镇 Mean: adj. 自私的; n. 平均.. he i ...