[hihoCoder] 岛屿 解题报告
2016-05-30 12:21
363 查看
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
给你一张某一海域卫星照片,你需要统计:
1. 照片中海岛的数目
2. 照片中面积不同的海岛数目
3. 照片中形状不同的海盗数目
其中海域的照片如下,"."表示海洋,"#"表示陆地。在"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。
上图所示的照片中一共有4座岛屿;其中3座面积为4,一座面积为2,所以不同面积的岛屿数目是2;有两座形状都是"####",所以形状不同的岛屿数目为3。
第一行包含两个人整数:N 和 M,(1 ≤ N, M ≤ 50),表示照片的行数和列数。
以下一个 N * M 的矩阵,表示表示海域的照片。
输出3个整数,依次是照片中海岛的数目、面积不同的海岛数目和形状不同的海岛数目。
样例输入
样例输出
思路: 一个普通的DFS的延伸, 其中岛屿的个数比较容易计算, 就是遍历数组碰到'#'就进行DFS, 并且为了防止再次搜索到这个点, 我们可以搜过之后改变其值. 面积就是每次搜索到的'#'的个数, 也比较容易. 海岛形状这个我们可以保存搜到的海岛的位置, 并且以最初的起点的岛屿为相对值0, 一个位置可以表示成(y*n + x), 这样我们就可以以一个数的形式保存一个位置, 保存的时候都减去起始点的值, 然后将其保存的二叉搜索树中去, 这样可以保持其大小有序. 然后看其不同的个数有多少即可.
代码如下:
单点时限:1000ms
内存限制:256MB
描述
给你一张某一海域卫星照片,你需要统计:1. 照片中海岛的数目
2. 照片中面积不同的海岛数目
3. 照片中形状不同的海盗数目
其中海域的照片如下,"."表示海洋,"#"表示陆地。在"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。
.####.. .....#. ####.#. .....#. ..##.#.
上图所示的照片中一共有4座岛屿;其中3座面积为4,一座面积为2,所以不同面积的岛屿数目是2;有两座形状都是"####",所以形状不同的岛屿数目为3。
输入
第一行包含两个人整数:N 和 M,(1 ≤ N, M ≤ 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; }
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- POJ1523 SPF dfs
- poj1731 Orders dfs
- Surrounded Regions
- Binary Tree Zigzag Level Order Traversal,Restore IP Addresses,Word Search,Simplify Path
- DFS基础(1)
- HDU1241 Oil Deposits
- DFS算法有趣小题目
- HDU 1016 Prime Ring Problem