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