• 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 }
  • 相关阅读:
    数据结构实验之栈四:括号匹配
    数据结构实验之栈三:后缀式求值
    8月7日学习
    8月6日学习
    8月5日学习
    8月4日学习
    周总结
    8月3日学习
    8月2日学习
    8月1日学习
  • 原文地址:https://www.cnblogs.com/plank-george-zzo/p/3239320.html
Copyright © 2020-2023  润新知