zoukankan      html  css  js  c++  java
  • 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<
  • 相关阅读:
    【转】构建高并发高可用的电商平台架构实践
    【转】深入解析浏览器的幕后工作原理
    【转】解释器,树遍历解释器,基于栈与基于寄存器
    EasyDarwin返回401 Unauthorized解决方法
    【转】SDP file
    音频PCM格式
    H264相关知识
    testNG之异常测试
    testNG之组测试
    testNG之顺序执行
  • 原文地址:https://www.cnblogs.com/cchun/p/2520199.html
Copyright © 2011-2022 走看看