Avoid The Lakes poj 3620

http://poj.org/problem?id=3620

题目大意:输入  r,c,k,表示一个图有r行,c列,然后输入k组坐标,表示图中的点,代表一个湖的位置,

如果湖有边相同则视为一个湖,(不是共点),问像这样的话,那么图中最大的湖含几个格子?

看题目描述,就能够确定dfs的做法,唯一的技巧是找一条路的时候找到底,把连起来的全部计数,然后比较,这里就要用到定义全局变量的技巧,每次dfs都能改变它的值(我代码中此变量为sum),既然相连的湖算一个而且已经计算过了,那么把找了的湖全标记为0,看成是土地,因为这对其他湖的朝朝结果不会有影响,反而可以带来优化。

总之呢,这个题目灰常简单喽,但是要留意有个坑。

题目的坐标从1开始,真是要小心啊。

不多说了,代码如下;

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 #define mem0(f) memset(f,0,sizeof(f))
 6 #define M 150
 7 int map[M][M];
 8 int r,c,k;
 9 int sum;
10 int cou;
11 void dfs(int x,int y)
12 {
13     if(x<=0||x>r||y<=0||y>c||map[x][y]==0)
14         return ;
15     sum++;
16     map[x][y]=0;
17     dfs(x,y+1);
18     dfs(x,y-1);
19     dfs(x+1,y);
20     dfs(x-1,y);
21     return;
22 }
23 int main()
24 {
25     int x,y;
26     while(~scanf("%d%d%d",&r,&c,&k))
27     {
28         cou=0;
29         mem0(map);
30         for(int i=0;i<k;i++)
31         {
32             scanf("%d%d",&x,&y);
33             map[x][y]=1;//x行y列
34         }
35         for(int i=1;i<=r;i++)
36             for(int p=1;p<=c;p++)
37         {
38             if(map[i][p]==1)
39             {
40                 sum=0;
41                 dfs(i,p);
42                 cou=cou>sum?cou:sum;
43             }
44         }
45         printf("%d
",cou);
46     }
47     return 0;
48 }
原文地址:https://www.cnblogs.com/plank-george-zzo/p/3239320.html