水灾

水灾(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

 个人算法找出洪水开始时的节点,人在的位置,两个bfs,先进行人的,

扩展当前能走到的步数(此时可扩展的节点有多个,如此节点被洪水淹没,则不进行扩展,注意判重),

然后进行洪水的bfs,扩展洪水,(注意判重)

此时扩展完当前步数可扩展的节点若 (人还可以移动则进行 bfs人)否则return,输出orz;

这样可以ac

由于种种原因代码丢失,懒得敲了;

std:

找出洪水开始的所有节点,写两个广搜,另一个搜索洪水走的路线bfs_1,一个搜索人走的路线 bfs_2。

在bfs_2中,人每走一步之前,先bfs_1搜索洪水下一秒将要淹没点,然后搜索人走的路线。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct note
{int x;int y;int step;};
char map[1500][61][61];
bool hsvisited[61][61];
bool renvisited[61][61];
int xgo[4]={1,-1,0,0};
int ygo[4]={0,0,1,-1};
int nowx;int nowy;int fx;int fy;int n;int m;
queue<note>q;
int main()
{
    freopen("sliker.in","r",stdin);
    freopen("sliker.out","w",stdout); 
    cin>>n>>m;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
      { 
          cin>>map[0][i][j];
          if(map[0][i][j]=='S')
          {
              nowx=i;
              nowy=j;
              map[0][i][j]='.';
              renvisited[i][j]=true;
          }
          if(map[0][i][j]=='D')
          {
              fx=i;fy=j;
          }
      }
    for(int z=1;z<=1300;z++)    //离线处理 //jiduanqingkuangbukaolvle chutiren meinamewuliao
    {
        memset(hsvisited,0,sizeof(hsvisited)); 
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            
            if(map[z-1][i][j]=='*')
            {
                for(int op=0;op<4;op++)
                {
                    int xn=i+xgo[op];
                    int yn=j+ygo[op];
                    if(map[z-1][xn][yn]=='.')
                    {
                        hsvisited[xn][yn]=1;
                    }
                    
                }
            }
            map[z][i][j]=map[z-1][i][j];
        }
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(hsvisited[i][j])
              map[z][i][j]='*';
        }
    }
    note zz;
    zz.x=nowx;
    zz.y=nowy;
    zz.step=0;
    q.push(zz);
    while(!q.empty())
    {
        note op=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int xn=op.x+xgo[i];
            int yn=op.y+ygo[i];
            int s=op.step;
            if((map[s+1][xn][yn]=='.'||map[s+1][xn][yn]=='D')&&!renvisited[xn][yn])
            {
                renvisited[xn][yn]=1;
                note iq;
                iq.x=xn;
                iq.y=yn;
                iq.step=s+1;
                if(xn==fx&&yn==fy)
                {
                    printf("%d",iq.step);
                    return 0;
                }
                q.push(iq);
            }
        }
        
    }
    printf("ORZ hzwer!!!");
    fclose(stdin);
    fclose(stdout);
    return 0;
}
/*
3 3
D.*
...
.S.
*/
/*
3 3
D.*
...
..S
*/
/*
3 6
D...*.
.X.X..
....S.
3 3
D..
...
..S
*/
原文地址:https://www.cnblogs.com/sssy/p/6883221.html