Lake Counting
Time Limit: 1000MS | Memory Limit: 65536K | |
Total 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.
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 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.
Sample Output
3
这道题目比较基础,可以深搜也可以广搜
深搜快一点 36ms,广搜47ms。很好的练习题目。
把注释的去掉就是深搜了。
#include <stdio.h>
#include <queue>
using namespace std;
#define N 102
char map[N][N];
int n,m;
struct Node
{
int x,y;
};
int dis[10][3]={ {0,1},{0,-1},{-1,0},{1,0},{-1,-1},{-1,1},{1,-1},{1,1} };
void search(int a,int b)
{
/*map[a][b]='.';
for(int i=0;i<8;i++)
{
int tmpx=a+dis[i][0];
int tmpy=b+dis[i][1];
if(tmpx>0 && tmpx<=n && tmpy>0 && tmpy<=m && map[tmpx][tmpy]=='W' ){
//map[tmpx][tmpy]='.';
search(tmpx,tmpy);
}
}*/
Node tmp,be;
be.x=a,be.y=b;
queue<Node> v;
v.push(be);
map[a][b]='.';
while(!v.empty())
{
be=v.front();
v.pop();
for(int i=0;i<8;i++)
{
tmp.x=be.x+dis[i][0];
tmp.y=be.y+dis[i][1];
if(tmp.x>0 && tmp.x<=n && tmp.y>0 && tmp.y<=m && map[tmp.x][tmp.y]=='W' )
{
v.push(tmp);
map[tmp.x][tmp.y]='.';
}
}
}
}
int main()
{
int i,j,count;
while(~scanf("%d %d",&n,&m))
{
getchar();
count=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%c",&map[i][j]);} ///缺了括号,害死人啊
getchar();}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(map[i][j]=='W')
{
//printf("%d %d\n",i,j);
search(i,j);count++;
}
printf("%d\n",count);
}
return 0;
}
深搜递归写法
#include <stdio.h> #include <queue> using namespace std; #define N 102 char map[N][N]; int n,m; void search(int i,int j) { if(map[i][j-1]=='W') { map[i][j-1]='.'; search(i,j-1); } if(map[i][j+1]=='W') { map[i][j+1]='.'; search(i,j+1); } if(map[i-1][j]=='W') { map[i-1][j]='.'; search(i-1,j); } if(map[i+1][j]=='W') { map[i+1][j]='.'; search(i+1,j); } if(map[i-1][j-1]=='W') { map[i-1][j-1]='.'; search(i-1,j-1); } if(map[i-1][j+1]=='W') { map[i-1][j+1]='.'; search(i-1,j+1); } if(map[i+1][j-1]=='W') { map[i+1][j-1]='.'; search(i+1,j-1); } if(map[i+1][j+1]=='W') { map[i+1][j+1]='.'; search(i+1,j+1); } } int main() { int i,j,count; while(~scanf("%d %d",&n,&m)) { getchar(); count=0; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%c",&map[i][j]);} ///缺了括号,害死人啊 getchar();} for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(map[i][j]=='W') { //printf("%d %d\n",i,j); search(i,j);count++; } printf("%d\n",count); } return 0; }