水洼 POJ2386 挑战程序设计竞赛
来源:互联网 发布:阴阳师网络剧 编辑:程序博客网 时间:2024/06/07 05:19
1.题目原文
http://poj.org/problem?id=2386
Lake Counting
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 30088 Accepted: 15038
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.
Given a diagram of Farmer John's field, determine how many ponds he has.
Input
* Line 1: Two space-separated integers: N and M
* Lines 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.
* Lines 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
Hint
OUTPUT DETAILS:
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
Source
USACO 2004 November
2.解题思路
采用深度优先搜索,从任意的w开始,不断把邻接的部分用'.'代替,1次DFS后与初始这个w连接的所有w就全都被替换成'.',因此直到图中不再存在W为止,总共进行DFS的次数就是答案。8个方向对应8个状态转移,每个格子作为DFS的参数最多调用一次,因此时间复杂度为O(8nm)=O(nm)。
3.AC代码
#include <iostream>#include<cstdio>using namespace std;#define maxn 105char field[maxn][maxn];int n,m;void dfs(int x,int y){ field[x][y]='.'; //循环遍历八个方向 for(int dx=-1;dx<=1;dx++){ for(int dy=-1;dy<=1;dy++){ int nx=x+dx,ny=y+dy; //判断(nx,ny)是否在园子里,以及是否有积水 if(0<=nx&&nx<n&&0<=ny&&ny<m&&field[nx][ny]=='W'){ dfs(nx,ny); } } }}void solve(){ int res=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(field[i][j]=='W'){ //从有积水的地方开始深搜 dfs(i,j); res++; } } } printf("%d\n",res);}int main(){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>field[i][j]; } } solve(); return 0;}
4.类似题目:
http://poj.org/problem?id=1979
题目和上述解法类似,直接贴代码。
#include <iostream>#include<cstdio>#include<cstring>using namespace std;#define maxn 25char field[maxn][maxn];bool mark[maxn][maxn];int n,m;int res;int dx[]={1,-1,0,0};int dy[]={0,0,1,-1};void dfs(int x,int y){ res++; mark[x][y]=true; //循环遍历八个方向 for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(0<=nx&&nx<n&&0<=ny&&ny<m&&field[nx][ny]=='.'&&!mark[nx][ny]){ //mark[x][y]=true; dfs(nx,ny); } }}void solve(){ int sx,sy; memset(mark,0,sizeof(mark)); res=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(field[i][j]=='@'){ sx=i; sy=j; } } } mark[sx][sy]=true; dfs(sx,sy); printf("%d\n",res);}int main(){ while(cin>>m>>n){ if(n==0&&m==0) break; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>field[i][j]; } } solve(); } return 0;}
0 0
- 水洼 POJ2386 挑战程序设计竞赛
- [挑战程序设计]POJ2386
- poj2386水洼dfs
- 《挑战程序设计竞赛》2.1.1 深度优先搜索 POJ2386 POJ1979 AOJ0118 AOJ0033 POJ3009
- 《挑战程序设计竞赛》 读后感
- 挑战程序设计竞赛:三角形
- 《挑战程序设计竞赛》 读后感
- 挑战程序设计竞赛(1)
- POJ2386水洼问题 优先深度搜索
- 挑战程序设计竞赛p42(贪心)
- ACM Ball(挑战程序设计竞赛)
- ACM Hopscotch(挑战程序设计竞赛)
- ACM Osenbei(挑战程序设计竞赛)
- ACM Packets(挑战程序设计竞赛)
- 挑战程序设计竞赛---POJ.2686
- 挑战程序设计竞赛---POJ.3233
- 挑战程序设计竞赛:0101抽签
- 挑战程序设计竞赛笔记_P55
- UVa12563 -Jin Ge Jin Qu hao(DP)
- 面向对象程序设计上机练习三(有默认参数的函数)
- [vijos1897]学姐吃牛排(dfs+heap+bst)
- oracle数据库备份和还原问题
- apache的rewrite规则
- 水洼 POJ2386 挑战程序设计竞赛
- struts1和struts2的区间
- python使用基础随记
- JS核心系列:浅谈原型对象和原型链
- Leetcode 111. Minimum Depth of Binary Tree 二叉树最小深度
- 1025: [SCOI2009]游戏
- 面向对象程序设计上机练习四(变量引用)
- Hive文件格式
- LeetCode 5. Longest Palindromic Substring