HDU 1241

题目描述:
2020年6月3日,征战了7年LQL联赛的丁丁妹宣布退役,总所周知,丁丁妹效力于GNR队,因为一次次精彩的操作被称为yyds,但可惜在最有分量的M比赛中没有拿到过冠军。退役后丁丁妹想要去发展自己的宝藏产业,她的宝藏储存地为nm的矩形,每个位置用代表空的地方,@代表有宝藏的地方。某些宝藏处相连(最近的八个位置,上下左右,斜线),他们被称为同一块宝藏。问有多少块宝藏处?

Input

有多组测试数据
每组测试数据两个数n,m
接下来n行,每行为1个长度为m且只包含'*'和'@'的字符串
1<=n,m<=100
输入结束的标志为n,m=0

Output

输出宝藏块的个数

Sample Input

3 5
*@*@*
**@**
@**@*
4 4
@@@@

****

@@@@

*@*@

0 0

Sample Output

2
2

题目简单的说就是统计nxm里有多少个宝藏,最近的八个位置,上下左右,斜线),他们被称为同一块宝藏。

思路:
BFS

步骤:
1、输入nxm的地图
2、从上到下,左到右,依次遍历数组p,遇到@(宝藏),sum++,并且将当前元素赋值为*,表示已经访问,调用bfs函数,向8个方向搜索,碰到宝藏@赋值*,继续调用bfs,直到全部查找完毕
2、输出sum

AC代码:

#include <iostream>
#include<cstdio>
using namespace std;
const int Max=100;
char P[Max+1][Max+1];
int r[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};
int n,m,sum;

void dfs(int x,int y)
{
	int tx,ty;//下一步
	for(int i=0;i<8;i++)
	{
		tx=x+r[i][0];
		ty=y+r[i][1];
		if(P[tx][ty]=='@'&&tx>=0&&ty>=0&&tx<n&&ty<m)
		{
			P[tx][ty]='*';
			dfs(tx,ty);
		}
	}
}
int main(void)
{
	while(scanf("%d %d",&n,&m)&&n&&m)
	{
		sum=0;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				cin >> P[i][j];
			}
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				if(P[i][j]=='@')
				{
				//每次找到一个@后就搜索它的八个方向,并且将八个方向的@变为*
				//这样在下一次找到@时就是另一块油田了
					P[i][j]='*';
					sum++;
					dfs(i,j);
				}
			}
		}

		cout<<sum<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值