题意:给出一个矩形,问有多少块连通的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);
}
}

  

最新文章

  1. windows server 2008 r2 企业版 hyper v做虚拟化的相关问题处理
  2. Log4j简单学习笔记
  3. .Net生成HTML的三种方法
  4. [v9] 列表页 调用 正文内容 或 自定义 字段(moreinfo的调用方法)
  5. [MySQL] SQL_ERROR 1032解决办法
  6. android 应用架构随笔六(Loading加载页面)
  7. Nginx架构的企业级应用
  8. C++ 11中的右值引用以及std::move
  9. Visual Studio 2010 Rebuild问题
  10. LayoutInflater的inflate函数用法
  11. SOAP 简单对象访问协议
  12. 教你一步一步部署.net免费空间OpenShift系列之四------绑定域名、使用CDN加速
  13. Web Service循序渐进学习
  14. 学习笔记:HTML+CSS 基础知识
  15. HDU--2021
  16. HDU 2119 Matrix
  17. linux软连接文件的copy
  18. MySQLdump之single-transaction详解
  19. 2.9 C++使用默认参数的构造函数
  20. 3月26 document的练习

热门文章

  1. Unity3D基础
  2. usaco 最少找零
  3. node操作mysql插入数据异常,incorrect string value
  4. JS判断客户端是否是iOS或者Android或者ipad(一)
  5. HDU1231 最长连续子序列
  6. luogu P4245 【模板】任意模数NTT MTT
  7. oralce存储过程实现不同用户之间的表数据复制
  8. Flask-Babel 使用简介(翻译文档)
  9. AMD包下载及使用
  10. Uboot优美代码赏析1:目录结构和malkefile分析