[hihoCoder] 岛屿 解题报告

原创 2016年05月30日 12:21:38
时间限制: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

思路: 一个普通的DFS的延伸, 其中岛屿的个数比较容易计算, 就是遍历数组碰到'#'就进行DFS, 并且为了防止再次搜索到这个点, 我们可以搜过之后改变其值. 面积就是每次搜索到的'#'的个数, 也比较容易. 海岛形状这个我们可以保存搜到的海岛的位置, 并且以最初的起点的岛屿为相对值0, 一个位置可以表示成(y*n + x), 这样我们就可以以一个数的形式保存一个位置, 保存的时候都减去起始点的值, 然后将其保存的二叉搜索树中去, 这样可以保持其大小有序. 然后看其不同的个数有多少即可.
代码如下:
/*************************************************************************
	> File Name: island.cpp
	> Author: Maoting Ren
	> Mail: mren@g.clemson.edu
	> Created Time: Sun 29 May 2016 04:23:38 PM EDT
 ************************************************************************/

#include<iostream>
#include<set>
#include<vector>
using namespace std;

int M, N, num = 0;
vector<vector<char> > map;
set<int> area;
set<set<int> > shape;

void DFS(pair<int, int> curPos, pair<int, int> oriPos, set<int>& st)
{
    int y=curPos.first, x=curPos.second, oy=oriPos.first, ox=oriPos.second;
    if(y>=N || y<0 || x<0 || x>=M || map[y][x]!='#') return; 
    st.insert(y*M+x - oy*M-ox);
    map[y][x] = '.';
    DFS(make_pair(y+1, x),oriPos, st);
    DFS(make_pair(y-1, x),oriPos, st);
    DFS(make_pair(y, x+1),oriPos, st);
    DFS(make_pair(y, x-1),oriPos, st);
}

int main()
{
    cin >> N >> M;
    for(int i = 0; i < N; i++)
    {
        vector<char> vec;
        char ch;
        for(int j =0; j < M; j++)
        {
            cin>> ch;
            vec.push_back(ch);
        }
        map.push_back(vec);
    }
    for(int i = 0; i < N; i++)
        for(int j =0; j < M; j++)
            if(map[i][j] == '#')
            {
                set<int> st{0};
                DFS(make_pair(i, j),make_pair(i, j), st);
                area.insert((int)st.size());   
                shape.insert(st);
                num++;
            }    
    cout << num << " " << area.size() << " " << shape.size() << endl;
    return 0;
}

 




版权声明:本文为博主原创文章,未经博主允许不得转载。

hihoCoder#1032_最长回文子串

求最长回文子串的算法比较经典的是manacher算法,下面写写自己的理解。 (文中用到的图片来自这里,博主写的很好,由于为了图片和代码一致,我稍微p了一下图片。) 首先,说明一下用到的数组和其他参...
  • sinat_30071459
  • sinat_30071459
  • 2016年04月02日 19:37
  • 1495

51nod 1276 岛屿的数量(锻炼思维的好题)

有N个岛连在一起形成了一个大的岛屿,如果海平面上升超过某些岛的高度时,则这个岛会被淹没。原本的大岛屿则会分为多个小岛屿,如果海平面一直上升,则所有岛都会被淹没在水下。 给出N个岛的高度。然后有Q个查询...
  • caduca
  • caduca
  • 2015年09月01日 20:57
  • 4161

ACM解题总结——HihoCoder1199 (微软笔试题)

题目来源:     HihoCoder1199  题目要求:     There is a tower defense game with n levels(missions). The n le...
  • octopusflying
  • octopusflying
  • 2016年08月03日 21:25
  • 1315

hihocoder #1033 交错和问题的思考

题目要求如下: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, …, an - 1,定义...
  • u011467044
  • u011467044
  • 2016年11月08日 22:26
  • 444

hihoCoder - 1089 - 最短路径·二:Floyd算法 (floyd算法!!)

#1089 : 最短路径·二:Floyd算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的中午,小Hi和小H...
  • u014355480
  • u014355480
  • 2015年01月01日 23:15
  • 758

[hihoCoder太阁最新面经算法竞赛2] 岛屿 (DFS,Hash Function)

hihoCoder太阁最新面经算法竞赛2 岛屿
  • zqh_1991
  • zqh_1991
  • 2016年07月15日 11:14
  • 449

交错和 (hihocoder)

求L到R之间的交错和为K的
  • jiangjiashi
  • jiangjiashi
  • 2014年10月08日 16:23
  • 3070

微软2016校园招聘4月在线笔试 hihocoder 1288 Font Size (模拟)

微软2016校园招聘4月在线笔试 hihocoder 1288 Font Size (模拟)
  • Tc_To_Top
  • Tc_To_Top
  • 2016年04月07日 14:20
  • 831

hiho 1487 并查集+搜索 [Offer收割]编程练习赛11 problem C 岛屿3

#1487 : 岛屿3 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国正在进行一项持续N周的填海造岛工程。整片工程...
  • qdbszsj
  • qdbszsj
  • 2017年03月26日 15:55
  • 429

hihoCoder 1166 交换代数 (高斯消元,概率)

题意: 给出区间[1,n]的状态,有0、1.现在每次可以选择任意区间取翻转,问全部翻转成0的次数期望。总共有n(n+1)/2个区间。 题解: 这个CLJ链接将的很清楚了。 那么根据高斯消元列方...
  • My_ACM_Dream
  • My_ACM_Dream
  • 2015年05月19日 23:49
  • 674
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[hihoCoder] 岛屿 解题报告
举报原因:
原因补充:

(最多只允许输入30个字)