Problem B: B.最大岛屿
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 24 Solved: 16
[ Submit][ Status][ Web Board]
Description
神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王。 这是一个由海洋、岛屿和海盗组成的危险世界。面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国。
杰克船长手头有一张整个海域的海图,上面密密麻麻分布着各个海屿的位置及面积。他想尽快知道整个海域共有多少岛屿以及最大岛屿的面积。
【约束条件】
①若一个陆地八个方向之一(上、下、左、右、左上、右上、左下、右下)的位置也是陆地,则视为同一个岛屿。
② 假设第一行,最后一行,第一列,最后一列全为0.
③ 1<M, N≤500 1<T≤100000
Input
第1行: M N T 表示海域的长,宽及一个单位表示的面积大小
接下来有M行 ,每行有N个01组成的序列以及其中穿插一些空格。0表示海水,1表示陆地,其中的空格没用,可以忽略掉。
Output
输出一行,有2个整数,一个空格间隔,表示整个海域的岛屿数,以及最大岛屿的面积
Sample Input
8 16 99
00000000 00000000
0000110011000000
0001111000111000
0000000 00 0000000
00111 111000001 10
001110000 0000000
0100001111 111100
0000000000000000
00000000 00000000
0000110011000000
0001111000111000
0000000 00 0000000
00111 111000001 10
001110000 0000000
0100001111 111100
0000000000000000
Sample Output
5 990
代码如下:
#include<iostream>
#include<map>
#include<string>
#include<cctype>
using namespace std;
int A[500][500], sum;
void DFS(int i, int j)
{
A[i][j] = 0;
if (A[i - 1][j] == 1) {
sum++; DFS(i - 1, j);
}
if (A[i - 1][j + 1] == 1){
sum++; DFS(i - 1, j + 1);
}
if (A[i][j + 1] == 1) {
sum++; DFS(i, j + 1);
}
if (A[i + 1][j + 1] == 1) {
sum++; DFS(i + 1, j + 1);
}
if (A[i + 1][j] == 1) {
sum++; DFS(i + 1, j);
}
if (A[i + 1][j - 1] == 1) {
sum++; DFS(i + 1, j - 1);
}
if (A[i][j - 1] == 1) {
sum++; DFS(i, j - 1);
}
if (A[i - 1][j - 1] == 1) {
sum++; DFS(i - 1, j - 1);
}
}
int main()
{
int M, N, T;
cin >> M >> N >> T;
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
char c;
cin>>c;
if (isdigit(c))A[i][j] = c - '0';
else j--;
}
}
int SUM = 0, max = 0;
for (int i = 1; i < M - 1; i++)
{
for (int j = 1; j < N - 1; j++)
{
if (A[i][j] == 1)
{
sum = 1;
DFS(i, j);
SUM++;
if (sum > max)max = sum;
}
}
}
cout << SUM << " " << max * T;
return 0;
}