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

A41760. 晶矿的个数在某个区域发现了一些晶矿,已经探明这些晶矿总共有分为两类,为红晶矿和黑晶矿。现在要统计该区域内红晶矿和黑晶矿的个数。假设可以用二维地图m[][]来描述该区域,若m[i][j]为#表示该地点是非晶矿地点,若m[i][j]为r表示该地点是红晶矿地点,若m[i][j]为b表示该地点是黑晶矿地点。一个晶矿是由相同类型的并且上下左右相通的晶矿点组成。现在给你该区域的地图,求红晶矿和黑晶矿的个数。…

填空题 困难

题目描述

晶矿的个数

在某个区域发现了一些晶矿,已经探明这些晶矿总共有分为两类,为红晶矿和黑晶矿。现在要统计该区域内红晶矿和黑晶矿的个数。假设可以用二维地图m[][]来描述该区域,若m[i][j]为#表示该地点是非晶矿地点,若m[i][j]为r表示该地点是红晶矿地点,若m[i][j]为b表示该地点是黑晶矿地点。一个晶矿是由相同类型的并且上下左右相通的晶矿点组成。现在给你该区域的地图,求红晶矿和黑晶矿的个数。

输入

第一行为k,表示有k组测试输入。 每组第一行为n,表示该区域由n*n个地点组成,3 <= n<= 30 接下来n行,每行n个字符,表示该地点的类型。

输出

对每组测试数据输出一行,每行两个数字分别是红晶矿和黑晶矿的个数,一个空格隔开。

样例输入

2

6

r##bb#

###b##

#r##b#

#r##b#

#r####

######

4

####

#rrb

#rr#

##bb

样例输出

2 2

1 2

参考答案

//示例代码 #include <bits/stdc++.h> using namespace std; char map_[35][35]; int x[4]={-1,1,0,0}; int y[4]={0,0,-1,1}; struct x_y{ int a,b; x_y(int x,int y){a=x;b=y;} }; int k,n,red,black; void bfs(int a,int b,char c){ queue<x_y> q; x_y t(a,b); q.push(t); map_[a][b]='#'; while(!q.empty()){ t=q.front(); q.pop(); for(int i=0;i<4;i++){ int aa=t.a+x[i]; int bb=t.b+y[i]; if(aa>=1&&aa<=n&&bb>=1&&bb<=n&&map_[aa][bb]==c){ x_y tt(aa,bb); q.push(tt); map_[aa][bb]='#'; } } } } int main() { cin>>k; while(k--){ cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ cin>>map_[i][j]; } red=black=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if(map_[i][j]=='r'){ bfs(i,j,'r'); red++; } else if(map_[i][j]=='b'){ bfs(i,j,'b'); black++; } } cout<<red<<" "<<black<<endl; } return 0; }
上一题 下一题