POJ 2386 Lake Counting【BFS】
2024-08-31 10:29:54
题意:给出一个矩形,问有多少块连通的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\n",ans);
}
}
最新文章
- windows server 2008 r2 企业版 hyper v做虚拟化的相关问题处理
- Log4j简单学习笔记
- .Net生成HTML的三种方法
- [v9] 列表页 调用 正文内容 或 自定义 字段(moreinfo的调用方法)
- [MySQL] SQL_ERROR 1032解决办法
- android 应用架构随笔六(Loading加载页面)
- Nginx架构的企业级应用
- C++ 11中的右值引用以及std::move
- Visual Studio 2010 Rebuild问题
- LayoutInflater的inflate函数用法
- SOAP 简单对象访问协议
- 教你一步一步部署.net免费空间OpenShift系列之四------绑定域名、使用CDN加速
- Web Service循序渐进学习
- 学习笔记:HTML+CSS 基础知识
- HDU--2021
- HDU 2119 Matrix
- linux软连接文件的copy
- MySQLdump之single-transaction详解
- 2.9 C++使用默认参数的构造函数
- 3月26 document的练习