水灾
大雨应经下了几天雨,却还是没有停的样子。土豪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强行ac
来,上代码:
#include<map> #include<queue> #include<cstdio> using namespace std; const int dx[5]={0,-1,0,1,0}; const int dy[5]={0,0,1,0,-1}; struct node { int x,y,now; }; struct node cur_1,cur_2,cur_3; int n,m,imap[51][51],sx,sy,ex,ey,ans; char cmap[51][51]; bool pd[51][51],if_all; queue<struct node>que; void make_water() { int now_1=2; while(now_1<200) { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(imap[i][j]>0&&imap[i][j]<now_1) { for(int v=1;v<=4;v++) { if(i+dx[v]<=n&&i+dx[v]>0&&j+dy[v]<=m&&j+dy[v]>0) { if(imap[i+dx[v]][j+dy[v]]==0) { imap[i+dx[v]][j+dy[v]]=now_1; } } } } } } now_1++; } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) if(imap[i][j]==0) imap[i][j]=3000; } } void bfs() { cur_1.x=sx,cur_1.y=sy,cur_1.now=1; pd[sx][sy]=true; que.push(cur_1); while(!que.empty()) { cur_1=que.front(); que.pop(); //printf("%d %d %d\n",cur_1.x,cur_1.y,cur_1.now); for(int i=1;i<=4;i++) { if(cur_1.x+dx[i]>0&&cur_1.y+dy[i]>0&&cur_1.x+dx[i]<=n&&cur_1.y+dy[i]<=m) { if(ex==cur_1.x+dx[i]&&ey==cur_1.y+dy[i]&&cur_1.now<imap[cur_1.x][cur_1.y]) { ans=cur_1.now; if_all=true; } if(if_all) break; if(imap[cur_1.x+dx[i]][cur_1.y+dy[i]]>cur_1.now&&!pd[cur_1.x+dx[i]][cur_1.y+dy[i]]) { pd[cur_1.x+dx[i]][cur_1.y+dy[i]]=true; cur_2.x=cur_1.x+dx[i]; cur_2.y=cur_1.y+dy[i]; cur_2.now=cur_1.now+1; que.push(cur_2); } } } if(if_all) break; } if(if_all) printf("%d\n",ans); else printf("ORZ hzwer!!!\n"); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%s",cmap[i]+1); for(int j=1;j<=m;j++) { if(cmap[i][j]=='D') ex=i,ey=j,imap[i][j]=-2; if(cmap[i][j]=='S') sx=i,sy=j; if(cmap[i][j]=='X') imap[i][j]=-1; if(cmap[i][j]=='*') imap[i][j]=1; } } make_water(); bfs(); return 0; }