zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    怎么查看京东店铺的品牌ID
    PPT编辑的时候很卡,放映的时候不卡,咋回事?
    codevs 1702素数判定2
    codevs 2530大质数
    codevs 1488GangGang的烦恼
    codevs 2851 菜菜买气球
    hdu 5653 Bomber Man wants to bomb an Array
    poj 3661 Running
    poj 1651 Multiplication Puzzle
    hdu 2476 String Painter
  • 原文地址:https://www.cnblogs.com/plank-george-zzo/p/3239320.html
Copyright © 2011-2022 走看看