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\n",cou); 46 } 47 return 0; 48 }
posted on 2013-08-05 21:25 plank george 阅读(211) 评论(0) 编辑 收藏 举报