题目描述:
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;
}