给定一幅地图,其中有水域,有陆地。被水域完全环绕的陆地是岛屿。有些岛屿上埋藏有宝藏,这些有宝藏的点也被标记出来了。本题就请你统计一下,给定的地图上一共有多少岛屿,其中有多少是有宝藏的岛屿。
输入格式:
输入第一行给出 2 个正整数 N 和 M(1<N×M≤10^5),是地图的尺寸,表示地图由 N 行 M 列格子构成。随后 N 行,每行给出 M 位个位数,其中 0
表示水域,1
表示陆地,2
–9
表示宝藏。
注意:两个格子共享一条边时,才是“相邻”的。宝藏都埋在陆地上。默认地图外围全是水域。
输出格式:
在一行中输出 2 个整数,分别是岛屿的总数量和有宝藏的岛屿的数量。
输入样例:
10 11
01000000151
11000000111
00110000811
00110100010
00000000000
00000111000
00114111000
00110010000
00019000010
00120000001
输出样例:
7 2
分析:这是一道BFS应用题。island中存储一共有多少座岛屿,precious中存储有宝藏的岛屿数量。用p标记每座岛屿是否有宝藏,XN与NY数组为上下左右走动的控制数组。将地图信息存储在string字符数组A中,Q存储的是坐标信息。
遍历每一个点,如果该点不为0的话,就进入它。不断向上下左右可以连接的岛屿进军,如果某个岛屿有宝藏,则将p标记成1,进军过的岛屿可以把它修改成’0’,后续就不会重复访问。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <iostream> #include <queue> using namespace std; int N, M, island, precious, p, NX[4] = {1, -1, 0, 0}, NY[4] = {0, 0, 1, -1}; string A[100005]; queue<pair<int,int>> Q; int main() { cin >> N >> M; for (int i = 0; i < N; i++) cin >> A[i]; for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) { if (A[i][j] != '0') { ++island; Q.push({i, j}); p = 0; if(A[i][j] >= '2') p = 1; A[i][j] = '0'; while(Q.size()) { int nowx = Q.front().first, nowy = Q.front().second; Q.pop(); for (int k = 0; k < 4; k++) { int X = nowx + NX[k], Y = nowy + NY[k]; if(X >= 0 && X < N && Y >= 0 && Y < M && A[X][Y] >= '1') { if(A[X][Y] >= '2') p = 1; Q.push({X, Y}); A[X][Y] = '0'; } } } if(p) ++precious; } } cout << island << ' ' << precious; return 0; } |
❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼