有一天小明爱上看动画片“喜洋洋与灰太狼” ,但是小明的妈妈不喜欢让小明看动画片,因为小明一看动画片就不认真做作业,于是妈妈就给小明出了难题:小明的姥姥家的后院养着一群羊,有一天姥姥由于疲劳睡着了,这时一群饿狼钻进了后院开始攻击羊群,后院是由许多个方格构成的长方形区域,每个方格中用字符‘.’表示空地, ‘#’表示栅栏, ‘o’表示羊, ‘v’表示狼,羊和狼所在的格子都是空地。如果从一个空地 A 沿着水平方向或垂直方向经过一系列的空地能够到达空地 B,则称空地 A 和空地 B 属于同一个羊圈。对于能够逃离后院的空地我们认为它不属于任何一个羊圈。
当一个羊圈中羊的数量大于狼的数量时,它们会用它们的尖角顶死该羊圈中的狼,否则就将被狼吃掉,最后每个羊圈中只会剩下一种动物。请你写程序帮小明计算一下, 战斗结束后所有羊圈中羊的总数和狼的总数?不然小明就再也不能看“喜羊羊与灰太狼了” 。
输入格式:
第一行包含两个用空格隔开的自然数 R 和 C,R 表示小明姥姥家家后院的行数,C 表示列数,接下来的 R 行每行包含 C 个字符,每个字符表示一个格子的情况。
输出格式:
仅一行,包含两个用一个空格隔开的整数,表示剩余羊的数量和狼的数量。
限制:
30%的数据,R,C<=30, 100%的数据,3<=R,C<=250
样例 1 :
输入: 9 12 .###.#####.. #.oo#...#v#. #..o#.#.#.#. #..##o#...#. #.#v#o###.#. #..#v#....#. #...v#v####. .####.#vv.o# .......####.
输出: 3 5
#include <stdio.h>
int n,m,step1,step2;
char a[251][251];
char book[251][251];//标记数组
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//创建方向数组如next[0][0]代表
void dfs(int x,int y) //向右x+0,next[0][1]y+1;
{
int i,j,tx,ty;
if(a[x][y]=='o')//判断是否为羊
step1++;
if(a[x][y]=='v')//判断是否为狼
step2++;
for(i=0;i<4;i++)//分别对四个方向搜索
{
tx=next[i][0]+x;
ty=next[i][1]+y;
if(tx<0||tx>n-1||ty<0||ty>m-1)//如果越界则所有计数归零并跳出
{
step1=0;step2=0;
return ;
}
if(book[tx][ty]==0&&a[tx][ty]!='#')//如果这个点符合条件
{
book[tx][ty]=1;//标记
dfs(tx,ty);
a[tx][ty]='#';//搜索后将此点更新为栅栏,防止后续再搜此点
book[tx][ty]=0;//解除标记
}
}
return ;
}
int main()
{
int i,j,t1=0,t2=0;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%s",a[i]);
for(i=1;i<n-1;i++)
{
for(j=1;j<m-1;j++)
{
if(a[i][j]!='#')
{
step1=0;//代表一次搜索羊和狼的数量
step2=0;
book[i][j]=1;
dfs(i,j);
if(step1>step2)
t1+=step1;
else
t2+=step2;
}
}
}
printf("%d %d\n",t1,t2);
return 0;
}
测题网站:https://www.acoj.com/problems/12101