题目描述
HYF家的后院养着一群羊,HYF由于疲劳睡着了,这时一群饿狼钻进了后院开始攻击羊群,后院是由许多个方格构成的长方形区域,每个方格中用字符“.”表示空地,“#”表示栅栏,“o”表示羊,“v”表示狼,羊和狼所在的格子都是空地。
如果从一个空地A沿着水平方向或垂直方向经过一系列的空地能够到达空地B,则称空地A和空地B属于同一个羊圈。对于能够逃离后院的空地我们认为它不属于任何一个羊圈。
当一个羊圈中羊的数量大于狼的数量时,它们会用它们的尖角顶死该羊圈中的狼,否则就将被狼吃掉,最后每个羊圈中只会剩下一种动物。
MM就这样一边听HYF讲故事,一遍数羊......通常羊还没数完就枕着HYF的声音入睡了......
QL:果然高手啊!
请你写程序帮MM计算一下,战斗结束后所有羊圈中羊的总数和狼的总数?不要羊还没数完就睡着了哦!
输入输出格式
输入格式:
第一行包含两个用空格隔开的自然数R和C,R表示HYF家后院的行数,C表示列数,接下来的R行每行包含C个字符,每个字符表示一个格子的情况。
输出格式:
仅一行,包含两个用一个空格隔开的整数,表示要求的羊的数量和狼的数量。
输入输出样例
输入样例:
9 12 .###.#####.. #.oo#...#v#. #..o#.#.#.#. #..##o#...#. #.#v#o###.#. #..#v#....#. #...v#v####. .####.#vv.o# .......####.
输出样例:
3 5
说明
数据规模:
对于30%的数据:R,C≤30;
对于100%的数据:3≤R,C≤250。
思路:硬搜联通快并统计即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
//程序名:新的C++程序 //作者: #include<iostream> #include<fstream> #include<algorithm> using namespace std; int sheep,wolf,x,y,n,m; char c[301][301]; bool flag; void dfs(int x,int y) { if(!c[x][y]){flag=true;return;} if(c[x][y]=='#')return; if(c[x][y]=='o')sheep++; else if(c[x][y]=='v')wolf++; c[x][y]='#'; dfs(x+1,y); dfs(x-1,y); dfs(x,y+1); dfs(x,y-1); return; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)cin>>c[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(c[i][j]!='#') { flag=0;sheep=0;wolf=0; dfs(i,j); if(!flag){if(sheep>wolf)x+=sheep;else y+=wolf;} } cout<<x<<" "<<y; return 0; }