POJ2386——经典的DFS
2015-12-25 12:47
204 查看
了解DFS算法,不妨看看 http://blog.csdn.net/chuck001002004/article/details/50396329 详解!
http://poj.org/problem?id=2386
题意:n*m的院子,‘ W ’代表有水,‘ . ’代表无水,若一个格子的八个方向存在‘ W ’则可以看做一个水塘,求一共有几个水塘
分析:经典的DFS,从第一个点开始遍历,只要发现其为‘ W ’便将他变为‘ . ’,之后遍历它的八个方向,如果发现有‘ W ’存在则重复上述操作。
http://poj.org/problem?id=2386
题意:n*m的院子,‘ W ’代表有水,‘ . ’代表无水,若一个格子的八个方向存在‘ W ’则可以看做一个水塘,求一共有几个水塘
分析:经典的DFS,从第一个点开始遍历,只要发现其为‘ W ’便将他变为‘ . ’,之后遍历它的八个方向,如果发现有‘ W ’存在则重复上述操作。
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> using namespace std; char a[105][105]; int n,m,sum; void DFS(int i,int j) { a[i][j]='.'; //千万将他变为'.',不然无法跳出递归 for(int x=-1;x<=1;x++) //遍历它的八个方向 { for(int y=-1;y<=1;y++) { //满足在院子范围内且对应的值为'W' if(a[i+x][j+y]=='W'&&(i+x)>0&&(i+x)<=n&&(j+y)>0&&(j+y)<=m) DFS(i+x,j+y); //遍历它的八个方向 } } return ; } int main() { while(cin>>n>>m) { sum=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i][j]=='W') { DFS(i,j); sum++; //这两步千万不要反了,否则就会是统计‘W’的个数 } } } cout<<sum<<endl; } return 0; }
相关文章推荐
- Meterpreter run vnc 遇到的问题
- 【ZYNQ-7000开发之六】使用PS控制DDR3的读写
- 网站后台登录地址大全
- 软件工程学习总结
- 每日一小练——求质数
- freemarker生成word,表格分页
- freemarker生成word,表格分页
- leetcode -- 线段树理解
- 【HNOI2013】比赛
- OC中 self.view.frame.size.height = 100; 不能通过编译的原因
- 关于vb编程之字符串连接/拼接的方法与技巧
- 基因测序名词解释
- git 常用操作
- (C++) CreateThread
- 在web.xml中注册IntrospectorCleanupListener监听器以解决spring mvc等框架可能产生的内存泄露问题
- Java基础学习总结(33)——Java8 十大新特性详解
- Java基础学习总结(33)——Java8 十大新特性详解
- Java8 十大新特性详解
- MapReduce 调优
- rest+go+mongodb