题目相关

题目链接

计蒜客,https://nanti.jisuanke.com/t/T1405。

我的OJ,http://47.110.135.197/problem.php?id=5254。

题目描述

神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠 1 号要征服各个海岛的海盜,最后成为海盗王。

这是一个由海洋、岛屿和海盗组成的危险世界。面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国。

杰克船长手头有一张整个海域的海图,上面密密麻麻分布着各个海屿的位置及面积。他想尽快知道整个海域共有多少岛屿以及最大岛屿的面积。

输入格式

第 11 行:M,N,T,表示海域的长,宽及一个单位表示的面积大小

接下来有 M 行 ,每行有 N 个 01 组成的序列以及其中穿插一些空格。0 表示海水,1 表示陆地,其中的空格没用,可以忽略掉。

输出格式

输出一行,有 2 个整数,一个空格间隔,表示整个海域的岛屿数,以及最大岛屿的面积。

输入样例

8 16 99
00000000 00000000
0000110011000000
0001111000111000
0000000  00 0000000
00111  111000001  10
001110000  0000000
0100001111 111100
0000000000000000

输出样例

5 990

数据范围

1 ≤ N, M, T ≤500。

说明

1:若一个陆地八个方向之一(上、下、左、右、左上、右上、左下、右下)的位置也是陆地,则视为同一个岛屿。

2:假设第一行,最后一行,第一列,最后一列全为 0。

题目分析

题意分析

在区域内找出由 1 构成的岛屿的数量,并计算最大岛屿的面积。

因此根据题意,我们可以知道,这是一题标准的 BFS 题目。当然本题可以使用 DFS,但是最好的方法是 BFS,因为 DFS 递归深度过深会导致程序爆堆栈。

特别说明

1、本题在路径搜索的时候是 8 个方向的,即上、下、左、右、左上、右上、左下、右下。

2、输入数据之间可能有空格,要忽略这个空格。

样例数据分析

和其他模板题差不多,没有特别需要注意的。下面我们使用下图做一个简单说明:

从上图,我们可以清楚的看到,一共 5 个岛屿,最大的岛屿由 10 个 1 组成,根据题目意思,每个 1 表示面积为 99,所以最大岛屿面积为 990。

算法思路

1、读入数据,处理空格。

2、将所有为 1 的位置加入到 vector 中。

3、以 vector 中所有坐标为起点,进行 BFS,每次搜索记录面积,搜索完记录岛屿数量。

4、输出。

AC 参考代码

BFS 代码

#include <iostream>
#include <queue>
#include <vector>using namespace std;const int MAXN = 500+4;
const int MAXM = 500+4;typedef struct _POS {int x;int y;
} POS;typedef struct _ROOM {int n;int m;char data[MAXN][MAXM];bool vis[MAXN][MAXM];
} ROOM;vector<POS> myvect;int bfs(ROOM &room, const POS &pos) {queue<POS> q;q.push(pos);room.vis[pos.x][pos.y]=true;const POS moves[] = {{0,-1}, {1,-1}, {1,0}, {1,1}, {0,1}, {-1,1}, {-1,0}, {-1,-1}};POS cur;POS next;int steps = 0;while (false==q.empty()) {steps++;cur = q.front();q.pop();for (int i=0; i<8; i++) {next.x = cur.x+moves[i].x;next.y = cur.y+moves[i].y;if (next.x>=0&&next.x<room.n&&next.y>=0&&next.y<room.m&&'1'==room.data[next.x][next.y]&&false==room.vis[next.x][next.y]) {room.vis[next.x][next.y]=true;q.push(next);}}}return steps;
}int main() {int t;ROOM room = {};cin>>room.n>>room.m>>t;char data;for (int i=0; i<room.n; i++) {for (int j=0; j<room.m; ) {cin>>room.data[i][j];if (' '!=room.data[i][j])  {if ('1'==room.data[i][j]) {POS pos = {i,j};myvect.push_back(pos);}j++;}}}int nums=0;int area=0;vector<POS>::iterator it;for (it=myvect.begin(); it<myvect.end(); it++) {POS pos = *it;if (false==room.vis[pos.x][pos.y]) {area = max(area, bfs(room, pos));nums++;}}cout<<nums<<" " << area*t <<endl;return 0;
}

DFS 代码

#include <iostream>
#include <queue>
#include <vector>using namespace std;const int MAXN = 500+4;
const int MAXM = 500+4;typedef struct _POS {int x;int y;
} POS;typedef struct _ROOM {int n;int m;char data[MAXN][MAXM];bool vis[MAXN][MAXM];
} ROOM;vector<POS> myvect; int steps;int dfs(ROOM &room, const POS &pos) {const POS moves[] = {{0,-1}, {1,-1}, {1,0}, {1,1}, {0,1}, {-1,1}, {-1,0}, {-1,-1}};POS next;for (int i=0; i<8; i++) {next.x = pos.x+moves[i].x;next.y = pos.y+moves[i].y;if (next.x>=0&&next.x<room.n&&next.y>=0&&next.y<room.m&&'1'==room.data[next.x][next.y]&&false==room.vis[next.x][next.y]) {room.vis[next.x][next.y]=true;steps++;dfs(room, next);}}
}int main() {int t;ROOM room = {};cin>>room.n>>room.m>>t;char data;for (int i=0; i<room.n; i++) {for (int j=0; j<room.m; ) {cin>>room.data[i][j];if (' '!=room.data[i][j])  {if ('1'==room.data[i][j]) {POS pos = {i,j};myvect.push_back(pos);}j++;}}}int nums=0;int area=0;vector<POS>::iterator it;for (it=myvect.begin(); it<myvect.end(); it++) {POS pos = *it;if (false==room.vis[pos.x][pos.y]) {steps = 0;dfs(room, pos);area = max(area, steps);nums++;}}cout<<nums<<" " << area*t <<endl;return 0;
}

计蒜客题解——T1769:最大岛屿相关推荐

  1. 计蒜客题解——T1414:抠图

    题目相关 题目链接 计蒜客,https://nanti.jisuanke.com/t/T1414. 我的 OJ,http://47.110.135.197/problem.php?id=4768. 题 ...

  2. 计蒜客题解——T1214:鸣人和佐助

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1214. 题目描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到 ...

  3. 计蒜客题解——T1213:拯救行动

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1213. 题目描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用 N×M(N,M≤200) 的矩阵来表 ...

  4. 计蒜客题解——T1244:单词序列

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1244. 我的 OJ,http://47.110.135.197/problem.php?id=4766 ...

  5. 计蒜客题解——最大的余数

    其实本题的难度真心不高,但是可以完整说明数据分析.标程.随机数生成.对拍等部分. 题目链接 原题来自计蒜客的某次比赛.计蒜客对应的链接为https://nanti.jisuanke.com/t/422 ...

  6. 计蒜客题解——T1157:派

    题目相关 题目链接 计蒜客,https://nanti.jisuanke.com/t/T1157. 我的OJ,http://47.110.135.197/problem.php?id=4951. 题目 ...

  7. 计蒜客题解-T1260宗教信仰

    题目概况 链接: https://nanti.jisuanke.com/t/T1260 难度: 普及/提高-(计蒜客评级普及T3,个人评价T2) 题目分析 简化题目: 有几群人,分别信仰不同的宗教,有 ...

  8. 计蒜客2020蓝桥杯大学A组模拟赛题解

    计蒜客2020蓝桥杯大学A组模拟赛题解 蓝桥杯的话,去年拿了C++组的国二.今年报名了新成立的Python组,不知道能不能摸到国一的鱼 模拟赛链接如下: https://www.jisuanke.co ...

  9. 计蒜客一月入门赛:《三个火枪手》题解

    题目链接(https://nanti.jisuanke.com/t/52314) 有 n 个人,其中有 m 对相互认识的关系. 一个人的知名度定义为 有多少人 和他相互认识. 现在蒜头君需要从这 n ...

最新文章

  1. FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题--转...
  2. Linux中用户管理
  3. 没有统计学基础可以学python-机器学习和Python怎样快速掌握?你一定需要这27张清单...
  4. vbs控制电脑说话,vbs获取时间,vbs小程序
  5. 【Leetcode】Python 代码本地构造二叉树、链表
  6. java 网站计数器_Java Bean实现网页来访计数器
  7. 如何建议一个数据库内的定时任务
  8. Python matplotlib生成图片背景透明
  9. oracle 创建job
  10. arcpy利用XY创建点
  11. DynamipsGUI使用入门
  12. 蓝桥杯-模拟风扇控制系统
  13. 179. 最大数 largestNumber
  14. 水星mr807虚拟服务器,水星MR807路由器怎么连接Internet上网
  15. 关于CFD计算过程的梳理
  16. matlab进行傅里叶分析
  17. python3进阶篇(二)——深析函数装饰器
  18. cmd的tree命令使用方法
  19. 用汇编写的计算阶乘N!的程序
  20. 百度SEO站群Pofo英文版主题-创意组合和博客主题(WordPress响应式)

热门文章

  1. 解决:is not eligible for getting processed by all BeanPostProcessors
  2. 使用Python处理百万数据量的Excel文件:删除列、切分换行、替换去重
  3. leetcode刷题记录--数据结构;深度优先搜索算法;二叉树;平衡树;1020. 飞地的数量;1669. 合并两个链表;108. 将有序数组转换为二叉搜索树
  4. 1980年华科计算机硬件专业,计算机硬件系统设计
  5. 推荐一个还不错的医学网站
  6. VNC Timed out waiting for a response from the computer
  7. Java(SpringMVC03)(SSM整合1)
  8. 【最小生成树】JZOJ_5353 村通网
  9. Cocos Creator皮毛功能之拖动多选扑克麻将
  10. vue比较完整的方法介绍 和获取事件对象