题目链接:最大岛屿
题目描述:
神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠 11 号要征服各个海岛的海盜,最后成为海盗王。 这是一个由海洋、岛屿和海盗组成的危险世界。面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国。 杰克船长手头有一张整个海域的海图,上面密密麻麻分布着各个海屿的位置及面积。他想尽快知道整个海域共有多少岛屿以及最大岛屿的面积。
输入格式
第 1 行:M,N,T,表示海域的长,宽及一个单位表示的面积大小 接下来有 M 行 ,每行有 N 个 01 组成的序列以及其中穿插一些空格。0 表示海水,1 表示陆地,其中的空格没用,可以忽略掉。
输出格式
输出一行,有 22 个整数,一个空格间隔,表示整个海域的岛屿数,以及最大岛屿的面积。 提示 1:若一个陆地八个方向之一(上、下、左、右、左上、右上、左下、右下)的位置也是陆地,则视为同一个岛屿。 2:假设第一行,最后一行,第一列,最后一列全为 00。 数据范围 1<=N,M,T<= 500 输出时每行末尾的多余空格,不影响答案正确性
样例
输入: 8 16 99 00000000 00000000 0000110011000000 0001111000111000 0000000 00 0000000 00111 111000001 10 001110000 0000000 0100001111 111100 0000000000000000 输出: 5 990
解题思路 此图使用dfs从(1,1)点开始搜索,因为陆地是1,是大于0的,因此只要属于一个岛屿的搜索后就将他变为负值,也就是染色。同一块岛屿用同一个负数来标记,最后总的岛屿数就是-num,再使用一个数组来保存每个岛屿的总面积,最后可得最大面积
代码
#include <iostream> #define inf 0x3f3f3f3f using namespace std; int m,n,t,sum,num; char map[505][505]; int s[505][505]; int k[505];//第i个岛屿的大小 int flag[505][505]; int tr[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; void dfs(int x,int y,int color) { s[x][y]=color; k[-color]++; for(int i=0;i<8;i++) { int tx=x+tr[i][0]; int ty=y+tr[i][1]; if(tx>0&&tx<=m&&ty>0&&ty<=n) { if(!flag[tx][ty]&&s[tx][ty]==1) { flag[tx][ty]=1; dfs(tx,ty,color); } } } } int main() { cin>>m>>n>>t; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { cin>>map[i][j]; if(map[i][j]==' '||map[i][j]=='0') { s[i][j]=0; }else { s[i][j]=1; } } } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(s[i][j]>0) { num--; flag[i][j]=1; dfs(i,j,num); } } } sum=-inf; for(int i=1;i<=-num;i++) { if(k[i]>sum) { sum=k[i]; } } cout<<-num<<" "<<sum*t<<endl; return 0; }