给定一幅地图,其中有水域,有陆地。被水域完全环绕的陆地是岛屿。有些岛屿上埋藏有宝藏,这些有宝藏的点也被标记出来了。本题就请你统计一下,给定的地图上一共有多少岛屿,其中有多少是有宝藏的岛屿。
输入格式:
输入第一行给出 2 个正整数 N 和 M(1<N×M≤105),是地图的尺寸,表示地图由 N 行 M 列格子构成。随后 N 行,每行给出 M 位个位数,其中 0
表示水域,1
表示陆地,2
-9
表示宝藏。
注意:两个格子共享一条边时,才是“相邻”的。宝藏都埋在陆地上。默认地图外围全是水域。
输出格式:
在一行中输出 2 个整数,分别是岛屿的总数量和有宝藏的岛屿的数量。
输入样例:
10 11
01000000151
11000000111
00110000811
00110100010
00000000000
00000111000
00114111000
00110010000
00019000010
00120000001
输出样例:
7 2
解题思路:
1,用邻接表的存储形式存储图,每个节点为一片大陆;
2,遍历邻接表输出数量;
c++代码如下:
#include <bits/stdc++.h>
#define elemtype int
using namespace std;
elemtype arrA[999][999];
elemtype arrB[999][999];
struct point
{
point(int a,int b,int c)
:_x(a)
,_y(b)
,_data(c)
{
}
int _x;
int _y;
int _data;
};
struct Gra_point
{
deque<point> _data;//分别存储<数字,x,y>
};
struct Graph
{
deque<Gra_point> _data;
};
void BFS(vector<point> &v,Gra_point &p,bool &b)
{
while(!v.empty())
{
int x = v.begin()->_x;
int y = v.begin()->_y;
int data = v.begin()->_data;
if(arrA[x][y] >=2 && arrA[x][y] <=9)
{
b = false;
}
//左
if(arrB[x][y-1] == 0 && arrA[x][y-1] != 0)
{
v.push_back(point(x,y-1,arrA[x][y-1])) ;
arrB[x][y-1] = arrA[x][y-1];
}
//上
if(arrB[x-1][y] == 0 && arrA[x-1][y] != 0)
{
v.push_back(point(x-1,y,arrA[x-1][y])) ;
arrB[x-1][y] = arrA[x-1][y];
}
//右
if(arrB[x][y+1] == 0 && arrA[x][y+1] != 0)
{
v.push_back(point(x,y+1,arrA[x][y+1])) ;
arrB[x][y+1] = arrA[x][y+1];
}
//下
if(arrB[x+1][y] == 0 && arrA[x+1][y] != 0)
{
v.push_back(point(x+1,y,arrA[x+1][y])) ;
arrB[x+1][y] = arrA[x+1][y];
}
//出队
p._data.push_back(point(x,y,data));
v.erase(v.begin());
}
}
int main()
{
//输入表
int res = 0;//宝藏岛的数量
int x,y;
cin >> x >> y;
memset(arrA,0,sizeof(arrA));//arrA初始化为0
memset(arrB,0,sizeof(arrB));//将arrB初始化
for(int i = 1;i <= x;++i)
{
for(int j = 1;j <= y;++j)
{
char c;
cin >> c;
int num;
num = atoi(&c);
arrA[i][j] = num;
}
}
//初始化图
Graph gra;
//循环处理图
for(int i = 1;i <= x;++i)
{
for(int j = 1;j <= y;++j)
{
if(arrB[i][j] == 0 && arrA[i][j] != 0)
{
bool b = true;//判断是否右宝藏
Gra_point p;
vector<point> v;//用于BFS
//头节点入队
arrB[i][j] = arrA[i][j];
v.push_back(point(i,j,arrA[i][j]));
//启动BFS
BFS(v,p,b);
//入表
gra._data.push_back(p);
if(!b)
{
++res;
}
}
}
}
//输出所有岛屿
/*
for(auto &elem : gra._data)
{
for(auto &t : elem._data)
{
cout << t._x << "," << t._y << " " << t._data << "|";
}
cout << endl;
}
*/
//输出
cout << gra._data.size();
cout << " ";
cout << res;
}