水灾(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(); }