• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

plank george

人生豪迈,只不过是重头再来。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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  阅读(212)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3