• 2014.5.31模拟赛【水灾】


    水灾(sliker.cpp/c/pas) 1000MS  64MB

    大雨应经下了几天雨,却还是没有停的样子。土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没。

    CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上有五种符号:“. * X D S”。其中“X”表示石头,水和人都不能从上面经过。“.”表示平原,CCY和洪水都可以经过。“*”表示洪水开始地方(可能有多个地方开始发生洪水)。“D”表示CCY的别墅。“S”表示CCY现在的位置。

    CCY每分钟可以向相邻位置移动,而洪水将会在CCY移动之后把相邻的没有的土地淹没(从已淹没的土地)。

    求CCY回到别墅的最少时间。如果聪哥回不了家,就很可能会被淹死,那么他就要膜拜黄金大神涨RP来呼叫直升飞机,所以输出“ORZ hzwer!!!”。

    输入文件 sliker.in

    输出文件 sliker.out

    Input

    3 3

    D.*

    .S.

    Output

    3

    Input

    3 3

    D.*

    ..S

    Output

    ORZ hzwer!!!

    Input

    3 6

    D…*.

    .X.X..

    ….S.

    Output

    6


    很裸的一道广搜,唯一的不同是在更新人的位置时还要更新水覆盖的位置。用两个队列存人和水的状态,用正常的广搜枚举人的同时,在时间t改变时更新水的位置即可

    //无聊的加了个快速读入,好像也没快多少

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,m;
    const int mx[4]={0,1,0,-1};
    const int my[4]={1,0,-1,0};
    struct dat{
    int x,y,t;
    }q1[100000],q2[100000];
    int t1,w1,t2,w2;
    int x1,y1,x2,y2;
    int st;
    int map[100][100];
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x*=10;x+=ch-'0';ch=getchar();}
        return x*f;
    }
    inline int mark(int x,int y)
    {if (x<1||y<1||x>n||y>m) return 0;return 1;}
    void bfs()
    {
    while (t2<w2)
    {
    int nx=q2[++t2].x,ny=q2[t2].y,nt=q2[t2].t;
    if (nt!=st)
    {
    st=nt;
    while (t1<w1&&q1[t1+1].t==nt-1)
    {
    t1++;
    for (int i=0;i<4;i++)
     {
      int cx=q1[t1].x+mx[i],cy=q1[t1].y+my[i];
      if (mark(cx,cy)&&map[cx][cy]!=2&&map[cx][cy]!=3&&!(cx==x2&&cy==y2))
    {
    q1[++w1].x=cx;
      q1[w1].y=cy;
      q1[w1].t=q1[t1].t+1;
      map[cx][cy]=3;
      }
     }
    }
    }
    if (map[nx][ny]==3) continue;
    if (nx==x2&&ny==y2) {printf("%d",nt);return;}
    for (int i=0;i<4;i++)
     {
      int wx=nx+mx[i];
      int wy=ny+my[i];
      if (mark(wx,wy)&&map[wx][wy]==1)
      {
      q2[++w2].x=wx;
      q2[w2].y=wy;
      q2[w2].t=nt+1;
      map[q2[w2].x][q2[w2].y]=4;
      }
     }
    }
    printf("ORZ hzwer!!!
    ");
    }
    int main()
    {
    freopen("sliker.in","r",stdin);
    freopen("sliker.out","w",stdout);
    n=read();m=read();
    for (int i=1;i<=n;i++)
     for (int j=1;j<=m;j++)
       {
        char ch;
        cin>>ch;
        if (ch=='.') map[i][j]=1;
        if (ch=='X') map[i][j]=2;
        if (ch=='*') {map[i][j]=3;q1[++w1].x=i;q1[w1].y=j;}
        if (ch=='S') {map[i][j]=4;q2[++w2].x=x1=i;q2[w2].y=y1=j;}
        if (ch=='D') {map[i][j]=1;x2=i;y2=j;}
       }
    bfs();
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    设计模式——设计原则与思想总结
    SQL——性能优化篇(下)
    计算机组成原理——入门篇
    SQL——性能优化篇(中)
    SQL——性能优化篇(上)
    设计模式——规范与重构(下)
    设计模式——规范与重构(上)
    编译原理——实现一门脚本语言 应用篇
    编译原理——实现一门脚本语言 原理篇(下)
    设计模式——设计原则实战
  • 原文地址:https://www.cnblogs.com/zhber/p/4035983.html
Copyright © 2020-2023  润新知