HDU1241_广度优先搜索

题目大意: 给你一个地图,有两种元素分别为‘.’与 ‘@’,然后要求你找出不相连的@的个数,@的邻接与@的对角都算是相连的。 解题思路: 广搜的入门题嘛,一开始想的时候,就感觉广搜很靠谱,因为搜相连的,用按层来历遍是比较好的,直接从地图上的每个点开始枚举,如果有一个点为@,那么就以这个点为起始点去开始广搜,然后广搜到它相连的点都标志掉,接着再重复一开始的操作。 吐吐槽: 做完这道题目后才发现,自己没有用到题目上那个一个连通块的@数目不能超过100,没加这个条件也ac了,是不是测试数据有点水…… 代码:
#include
#include
const int MAX=105;
using namespace std;
int m,n;
char map[MAX][MAX];
bool visited[MAX][MAX];
typedef struct n
{
	int x,y;
}N;
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
void BFS(int x,int y)
{
	queueQ;
	N pre,cur;
	pre.x=x;
	pre.y=y;
	Q.push(pre);
	visited[pre.x][pre.y]=true;
	while(!Q.empty())
	{
		pre=Q.front();
		Q.pop();
		for(int i=0;i<8;i++)
		{
			cur=pre;
			cur.x+=dir[i][0];
			cur.y+=dir[i][1];
			if(visited[cur.x][cur.y]==false && map[cur.x][cur.y]=='@' && cur.x>=1 && cur.x<=m
				&& cur.y>=1 && cur.y<=n)
			{
				visited[cur.x][cur.y]=true;
				Q.push(cur);
			}
		}
	}
}
void init()
{
	memset(visited,false,sizeof(visited));
}
int main(void)
{
	while(cin>>m>>n,m)//m为行
	{
		init();
		int i,j;
		for(i=1;i<=m;i++)
		{
			scanf("%s",map[i]+1);
		}
		int count=0;
		for(i=1;i<=m;i++)
			for(j=1;j<=n;j++)
			{
				if(visited[i][j]==false && map[i][j]=='@')
				{
					BFS(i,j);
					count++;
				}
			}
		cout<

转载于:https://www.cnblogs.com/cchun/archive/2011/12/03/2520199.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值