喜羊羊与灰太狼——深度优先搜索

本文介绍了一个关于动画片的趣味编程题目,通过一个故事背景引入了一道算法问题。题目要求编写程序计算羊和狼战斗后的存活数量,涉及到图遍历、深度优先搜索等算法概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一天小明爱上看动画片“喜洋洋与灰太狼” ,但是小明的妈妈不喜欢让小明看动画片,因为小明一看动画片就不认真做作业,于是妈妈就给小明出了难题:小明的姥姥家的后院养着一群羊,有一天姥姥由于疲劳睡着了,这时一群饿狼钻进了后院开始攻击羊群,后院是由许多个方格构成的长方形区域,每个方格中用字符‘.’表示空地, ‘#’表示栅栏, ‘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

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值