【POJ2386】Lake Counting(深搜与广搜)
2016-07-20 09:12
267 查看
Lake Counting
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 17917 Accepted: 9069
Description
Due to recent rains, water has pooled in various places in Farmer John’s field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water (‘W’) or dry land (‘.’). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.Given a diagram of Farmer John’s field, determine how many ponds he has.
Input
Line 1: Two space-separated integers: N and MLines 2..N+1: M characters per line representing one row of Farmer John’s field. Each character is either ‘W’ or ‘.’. The characters do not have spaces between them.
Output
Line 1: The number of ponds in Farmer John’s field.Sample Input
10 12W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.
Sample Output
3这一题就是油田问题的翻版,题目大意就是说找出W组成的块(一个块是几个W连接在一起的,可能通过斜线也能连接。)有几个。
题目很简单,循环找到W然后将与其连接的置为‘.’。块数+1,就可以了。
下面是两种做法:
深搜:
#include "iostream" #include "cstdio" #include "cstring" #include "algorithm" #include "math.h" using namespace std; const int maxn = 1e2+5; char map[maxn][maxn]; int n,m; int changeX[8]={0,0,1,1,1,-1,-1,-1}; int changeY[8]={1,-1,1,-1,0,1,-1,0}; int check(int x,int y){ if(x<0||y<0||x>n||y>m||map[x][y]!='W') return 0; return 1; } void dfs(int x,int y){ int i; for(i=0 ; i<8 ; i++){ int nowX = x+changeX[i]; int nowY = y+changeY[i]; if(check(nowX,nowY)){ map[nowX][nowY]='.'; dfs(nowX,nowY); } } } int main(){ while(~scanf("%d%d",&n,&m)){ int ans=0; for(int i=0 ; i<n ; i++){ for(int j=0 ; j<m ; j++){ cin>>map[i][j]; } } for(int i=0 ;i<n ; i++){ for(int j=0 ;j<m ; j++){ if(map[i][j]=='W'){ dfs(i,j); ans++; } } } printf("%d\n",ans); } return 0; }
广搜:
#include "iostream" #include "cstdio" #include "cstring" #include "algorithm" #include "math.h" #include "queue" using namespace std; const int maxn = 1e2+5; char map[maxn][maxn]; int n,m; int ans; int changeX[8]={0,0,1,1,1,-1,-1,-1}; int changeY[8]={1,-1,1,-1,0 4000 ,1,-1,0}; struct FYJ{ int x; int y; }; int check(int x,int y){ if(x<0||y<0||x>n||y>m||map[x][y]!='W') return 0; return 1; } void BFS(int x,int y){ queue<FYJ>q; FYJ now,to; now.x=x; now.y=y; q.push(now); while(!q.empty()){ now = q.front(); q.pop(); for(int i=0 ; i<8 ; i++){ to.x=now.x+changeX[i]; to.y=now.y+changeY[i]; if(check(to.x,to.y)){ q.push(to); map[to.x][to.y]='.'; } } } } int main(){ while(~scanf("%d%d",&n,&m)){ ans = 0; for(int i=0 ; i<n ; i++){ for(int j=0 ; j<m ; j++){ cin>>map[i][j]; } } for(int i=0 ; i<n ; i++){ for(int j=0 ; j<m ; j++){ if(map[i][j]=='W'){ ans++; BFS(i,j); } } } printf("%d\n",ans); } return 0; }
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- C++深度优先搜索的实现方法
- 基于文本的搜索
- php实现搜索一维数组元素并删除二维数组对应元素的方法
- 使用Sphinx对索引进行搜索
- asp 多关键词搜索的简单实现方法
- C#使用foreach语句搜索数组元素的方法
- WordPress中用于获取搜索表单的PHP函数使用解析
- JavaScript中数组的排序、乱序和搜索实现代码
- jquery ztree实现树的搜索功能
- 【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
- C#编程实现Excel文档中搜索文本内容的方法及思路
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- sqlserver中在指定数据库的所有表的所有列中搜索给定的值
- 可以用来搜索当前页面内容的js代码
- 全文搜索和替换
- javascript搜索自动提示功能的实现第1/3页
- iOS应用中UISearchDisplayController搜索效果的用法