最初不会的地方:
1、 其实连样例开始的时候就没读懂……
2、 从哪里搜?
3、 搜的边界?
4、 把一片搜完了,然后呢?
5、 回溯吗?(这道题看到了回溯和DFS的区别)
标程的解决方法:
2、任何一个位置都可以,反复搜,所以从(0,0)位置起
3、搜的结果是把可以连为一片的W都标为1,W周围的.仍作为边界。
4、搜到所有的W都标为1的时候 搜索就结束了。(其实有这个原因:每个W必然属于一个区域,ans至少一个区域,当还有w没有被标记,就说明还有区域计数,当所有的W都被计数,就可以输出Ans)
另外,此题还然我学到几点:
一、int dir[2][8]={{-1,-1,-1,0,0,1,1,1},{-1,0,1,-1,1,-1,0,1}};
左边的{}是行坐标,右边是列坐标。
这样dfs的时候就不用写八个了……
void dfs(int i,int j)
{
int k,a,b;
for(k=0;k<8;k++)
{
a=dir[0][k]+i;
b=dir[1][k]+j;
if(a>=0&&a<=n&&b>=0&&b<=m&&!vis[a][b]&&map[a][b])
{
vis[a][b]=1;
dfs(a,b);
}
}
}
二读入map直接记录为1,0
三、好好看本题的代码,体会回溯和DFs区别
贴代码:
Lake Counting
Time Limit: 1000MS | Memory Limit: 65536K |
Total Submissions: 16081 | Accepted: 8141 |
Description
Due to recentrains, water has pooled in various places in Farmer John's field, which isrepresented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100)squares. Each square contains either water ('W') or dry land ('.'). Farmer Johnwould like to figure out how many ponds have formed in his field. A pond is aconnected set of squares with water in them, where a square is consideredadjacent to all eight of its neighbors.
Given a diagram of Farmer John's field, determine how many ponds he has.
Input
* Line 1: Twospace-separated integers: N and M
* Lines 2..N+1: M characters per line representing one row of Farmer John'sfield. Each character is either 'W' or '.'. The characters do not have spacesbetween them.
Output
* Line 1: Thenumber 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
Hint
OUTPUTDETAILS:
There are three ponds: one in the upper left, one in the lower left,and onealong the right side.
Source
#include<cstdio>
#include<cstring>
using namespace std;
#define N 101
bool vis[N][N],map[N][N];
int fi,fj,m,n,count;
int dir[2][8]={{-1,-1,-1,0,0,1,1,1},{-1,0,1,-1,1,-1,0,1}};
int find()
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(!vis[i][j]&&map[i][j])
{
fi=i;
fj=j;
return 1;
}
}
return 0;
}
void dfs(int i,int j)
{
int k,a,b;
for(k=0;k<8;k++)
{
a=dir[0][k]+i;
b=dir[1][k]+j;
if(a>=0&&a<=n&&b>=0&&b<=m&&!vis[a][b]&&map[a][b])
{
vis[a][b]=1;
dfs(a,b);
}
}
}
int main()
{
int i,j;
char c;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(map,0,sizeof(map));
count=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%c",&c);
if(c=='W')map[i][j]=1;
else if(c=='.')map[i][j]=0;
else if(c==' '||c=='\n'||c=='\0')j--;
}
while(find())
{
vis[fi][fj]=1;
dfs(fi,fj);
count++;
}
printf("%d\n",count);
}
return 0;
}