oiclass P1315. 羊和狼
问题描述
米基家的后院养着一群羊,米基由于疲劳睡着了,这时一群饿狼钻进了后院开始攻击羊群,后院是由许多个方格构成的长方形区域,每个方格中用字符 . 表示空地,# 表示栅栏,o 表示羊,v 表示狼,羊和狼所在的格子都是空地。
如果从一个空地 A 沿着水平方向或垂直方向经过一系列的空地能够到达空地 B,则称空地 A 和空地 B 属于同一个羊圈。对于能够逃离后院的空地我们认为它不属于任何一个羊圈。
当一个羊圈中羊的数量大于狼的数量时,它们会用它们的尖角顶死该羊圈中的狼,否则就将被狼吃掉,最后每个羊圈中只会剩下一种动物。
写一个程序统计战斗结束后所有羊圈中羊的总数和狼的总数。
输入格式
输入文件的第一行包含两个用空格隔开的自然数 R 和 C,其中 3≤R,C≤250, R 表示米基家后院的行数, C 表示列数,接下来的 R 行每行包含 C 个字符,每个字符表示一个格子的情况。 输出格式
输出文件仅一包含两个用一个空格隔开的整数,表示要求的羊的数量和狼的数量。
输入数据 1
9 12
.###.#####..
#.oo#...#v#.
#..o#.#.#.#.
#..##o#...#.
#.#v#o###.#.
#..#v#....#.
#...v#v####.
.####.#vv.o#
.......####.
输出数据 1
3 5
其实这题矩阵存储图,或者可以用BFS 或 DFS 。题意为将每一个点与上下左右的邻接点(非‘#“标记)形成路径进行构图。利用深搜或广搜的思路求封闭于区域内的狼数和羊数,对两者的数据进行处理。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int r,c,sleepnomber,wolfnomber,a[300][300],sleep,wolf,xx[5]={-1,0,1,0},yy[5]={0,1,0,-1};
char b;
bool flag;
void bfs(int x,int y){
if((x<1||x>r||y<1||y>c)) {
flag=false;
return ;
}
else if(a[x][y]==0) return ;
else if(a[x][y]==1) sleep+=1;
else if(a[x][y]==2) wolf+=1;
a[x][y]=0;
for(int i=0;i<4;i++) bfs(x+xx[i],y+yy[i]);
}
int main() {
cin>>r>>c;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>b;
if(b=='o')a[i][j]=1;
else if(b=='v') a[i][j]=2;
else if(b=='#') a[i][j]=0;
else a[i][j]=3;
}
}
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
if(a[i][j]>0){
sleep=0,wolf=0;
flag=true;
bfs(i,j);
//cout<<sleep<<" "<<wolf<<endl;
if(flag==true){
if(sleep<=wolf) wolfnomber+=wolf;
else sleepnomber+=sleep;
}
}
}
}
cout<<sleepnomber<<" "<<wolfnomber;
}