现在的位置: 首页 > 综合 > 正文

2014.5.31模拟赛【水灾】

2018年01月13日 ⁄ 综合 ⁄ 共 1889字 ⁄ 字号 评论关闭

水灾(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!!!\n");
}
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();
}

抱歉!评论已关闭.