测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A30288. 寻宝图

填空题 困难

题目描述

寻宝图

题目描述

给定一幅地图,其中有水域,有陆地。被水域完全环绕的陆地是岛屿。有些岛屿上埋藏有宝藏,这些有宝藏的点也被标记出来了。本题就请你统计一下,给定的地图上一共有多少岛屿,其中有多少是有宝藏的岛屿。

时间限制: 1000        内存限制: 262144

输入

输入第一行给出 2 个正整数 N 和 M(1 < N × M ≤ 100000 ) ,是地图的尺寸,表示地图由 N 行 M 列格子构成。随后 N 行,每行给出 M 位个位数,其中 `0` 表示水域,`1 `表示陆地,`2`-`9` 表示宝藏。注意: 两个格子共享一条边时,才是“相邻”的。默认地图外围全是水域。

输出

在一行中输出 2 个整数,分别是岛屿的总数量和有宝藏的岛屿的数量。

样例输入

10 11

01000000151

11000000111

00110000811

00110100010

00000000000

00000111000

00114111000

00110010000

00019000010

00120000001

样例输出

7 2

参考答案

#include<stdio.h> #include<queue> #include<vector> #include<string> using namespace std; #define int long long #define abs(x) ((x)<0?-(x):(x)) #define INF 07777777777 #define MAX 07777777 vector<int> g[MAX]; int d[8][2]={1,0,0,1,-1,0,0,-1},n,m; int cnt1=0,cnt2=0; void bfs(int x,int y){ int pan=0; queue<pair<int,int> > qu; qu.push({x,y}); if(g[x][y]!=1) pan=1; g[x][y]=-2; while(!qu.empty()){ x=qu.front().first,y=qu.front().second; qu.pop(); for(int i=0;i<4;i++){ if(x+d[i][0]>=0&&x+d[i][0]<n&&y+d[i][1]>=0&&y+d[i][1]<m&&g[x+d[i][0]][y+d[i][1]]>0){ if(g[x+d[i][0]][y+d[i][1]]!=1) pan=1; g[x+d[i][0]][y+d[i][1]]=-2; qu.push({x+d[i][0],y+d[i][1]}); } } } cnt2+=pan; } signed Solve(){ //n=read(),m=read(); scanf("%lld %lld",&n,&m); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ char c; scanf(" %c",&c); if(c=='0') g[i].push_back(0); else if(c=='1') g[i].push_back(1); else g[i].push_back(2); } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(g[i][j]>0){ cnt1++; bfs(i,j); } } } printf("%lld %lld\n",cnt1,cnt2); return 0; } signed main(){ Solve(); return 0; }
上一题 下一题