HYF 家的后院养着一群羊,HYF 由于疲劳睡着了,这时一群饿狼钻进了后院开始攻击羊群,后院是由许多个方格构成的长方形区域,每个方格中用字符’.’表示空地,'#’表示栅栏,'o’表示羊,'v’表示狼,羊和狼所在的格子都是空地。
如果从一个空地A沿着水平方向或垂直方向经过一系列的空地能够到达空地 B,则称空地A和空地B属于同一个羊圈。对于能够逃离后院的空地我们认为它不属于任何一个羊圈。
当一个羊圈中羊的数量大于狼的数量时,它们会用它们的尖角顶死该羊圈中的狼,否则就将被狼吃掉,最后每个羊圈中只会剩下一种动物。
【输入文件】
第一行包含两个用空格隔开的自然数 R 和 C,R 表示 HYF 家后院的行数,C表示列数,接下来的R行每行包含C个字符,每个字符表示一个格子的情况。
【输出文件】
仅一行,包含两个用一个空格隔开的整数,表示剩余的羊的数量和狼的数量。
【数据规模】
30%的数据:
�
,
�
<
30
R,C<=30
100%的数据:
3
<
�
,
�
<
250
3<=R,C<=250
#include <bits/stdc++.h>
using namespace std;
int n,m,ans1,ans2;
char a[300][300];
bool vis[300][300];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
void bfs(int x,int y){
queue<pair<int ,int>> q;
q.push({x,y});
vis[x][y]=true;
int res1=0,res2=0;
while(!q.empty()){
auto t=q.front();
q.pop();
int xx=t.first;
int yy=t.second;
if(a[xx][yy]=='o'){
res1++;
}
else if(a[xx][yy]=='v'){
res2++;
}
for(int i=0;i<4;i++){
int tx=xx+dx[i];
int ty=yy+dy[i];
if(tx<1||tx>n||ty<1||ty>m||vis[tx][ty]||a[tx][ty]=='#') continue;
q.push({tx,ty});
vis[tx][ty]=true;
}
}
if(res1>res2){
ans1+=res1;
}
else{
ans2+=res2;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<n;i++){
for(int j=1;j<=m;j++){
if(!vis[i][j]&&a[i][j]!='#'){
bfs(i,j);
}
}
}
cout<<ans1<<" "<<ans2;
return 0;
}