zoukankan      html  css  js  c++  java
  • HDU 3329 The Flood

    HDU_3329

    我们可以二分枚举涨水的高度,然后先对外围一层做一次深搜,把所有被淹没的点做上标记,再对没有标记过的点进行深搜,如果深搜后发现有两块或多于两块的土地,那么当前深度的水就是符合要求的,否则就是不符合要求的,之后更改相应的max以及min的值即可。

    #include<string.h>
    #include<stdio.h>
    int a[110][110],vis[110][110];
    int n,m,max,min,mid;
    int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
    void dfs1(int x,int y)
    {
    int i,newx,newy;
    for(i=0;i<4;i++)
    {
    newx=x+dx[i];
    newy=y+dy[i];
    if(newx>=0&&newx<=n+1&&newy>=0&&newy<=m+1
    &&a[newx][newy]<=mid&&!vis[newx][newy])
    {
    vis[newx][newy]=1;
    dfs1(newx,newy);
    }
    }
    }
    void dfs2(int x,int y)
    {
    int i,newx,newy;
    for(i=0;i<4;i++)
    {
    newx=x+dx[i];
    newy=y+dy[i];
    if(newx>=1&&newx<=n&&newy>=1&&newy<=m
    &&!vis[newx][newy])
    {
    vis[newx][newy]=1;
    dfs2(newx,newy);
    }
    }
    }
    int main()
    {
    int i,j,k,t,flag;
    t=0;
    while(1)
    {
    scanf("%d%d",&n,&m);
    if(!n)
    break;
    memset(a,0,sizeof(a));
    max=0;
    min=1000000000;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    {
    scanf("%d",&a[i][j]);
    if(a[i][j]>max)
    max=a[i][j];
    if(i==1||i==n||j==1||j==m)
    if(a[i][j]<min)
    min=a[i][j];
    }
    max++;
    flag=max;
    while(1)
    {
    mid=(min+max)/2;
    memset(vis,0,sizeof(vis));
    dfs1(0,0);
    k=0;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    if(!vis[i][j])
    {
    vis[i][j]=1;
    k++;
    dfs2(i,j);
    }
    if(k>1)
    max=mid;
    if(mid==min)
    break;
    if(k<=1)
    min=mid;
    }
    printf("Case %d: ",++t);
    if(max==flag)
    printf("Island never splits.\n");
    else
    printf("Island splits when ocean rises %d feet.\n",max);
    }
    return 0;
    }


  • 相关阅读:
    Day1-CSS-下拉菜单
    scau 1138 代码等式
    SCAU-1076 K尾相等数
    勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创)
    SCAU-1144 数星星-HDU-1166-树状数组的应用
    NodeJs Fs模块
    Node核心模块
    flutter环境配置
    纯CSS制作图形效果
    CSS3选择器
  • 原文地址:https://www.cnblogs.com/staginner/p/2190531.html
Copyright © 2011-2022 走看看