zoukankan      html  css  js  c++  java
  • POJ 2386 Lake Counting【BFS】

    题意:给出一个矩形,问有多少块连通的W

    当找到W的时候,进行广搜,然后将搜过的W变成点,直到不能再搜,进行下一次广搜,最后搜的次数即为水塘的个数

    看的PPT里面讲的是种子填充法。

    种子填充算法:

    从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止 对于这一题: 先枚举矩阵中的每一个元素,当元素为W的时候,对它进行种子填充(BFS)

    种子填充过程:

    1)将八个方向的状态分别加进队列

    2)如果元素为W,将其改为点

    3)用BFS将相邻的点加入队列,直到没有可加入的节点

    #include<iostream>  
    #include<cstdio>  
    #include<cstring>  
    #include<algorithm> 
    #include<queue> 
    using namespace std;
    int n,m,r;
    int dir[8][2]={{-1,1},{0,1},{1,1},{-1,0},{1,0},{-1,-1},{0,-1},{1,-1}};
    char map[1000][1000];
    void bfs(int x,int y)
    {
        queue<int> q;
    	q.push(x);q.push(y);
    	map[x][y]='.';
    	while(!q.empty())
    	{
    		int  a=q.front();q.pop();
    		int  b=q.front();q.pop();
    		for(int i=0;i<8;i++)
    		{
    			int c=a+dir[i][0];
    			int d=b+dir[i][1];
    			if(c>0&&c<=n&&d>0&&d<=m&&map[c][d]=='W')
    			{
    				map[c][d]='.';				
    				q.push(c);q.push(d);
    			}			
    		}		
    	}
    }
    int main()
    {
    	int i,j,ans;
    	while(scanf("%d %d",&n,&m)!=EOF)
    	{
    		ans=0;
    		for(i=1;i<=n;i++)
    		 for(j=1;j<=m;j++)
    			cin>>map[i][j];
    				
    				for(i=1;i<=n;i++)
    				 for(j=1;j<=m;j++)
    					if(map[i][j]=='W') ans++,bfs(i,j);													
    		printf("%d
    ",ans);
    	}
    }
    

      

  • 相关阅读:
    new 做了什么
    create-react-app+react-app-rewired引入antd实践
    实战build-react(二)-------引入Ant Design(增加)
    package.json文件
    读书多些会怎样
    关于学历
    QDialog弹出一个窗口,改变窗口大小
    #include <thread>
    #include <memory>
    #include <map>
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4284380.html
Copyright © 2011-2022 走看看