得分:100+40+30=170,还是可以的。
1. 水灾(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
思路:
广搜。和其他题不同的是可以扩展的点不只有起点,还有洪水所在的点。处理好每个点的扩展状态就和一般广搜一样了。
代码:
1 #include<cstdio> 2 #include<queue> 3 using namespace std; 4 5 int n,m,Sx,Sy,Ex,Ey,cnt,To[5]={1,0,-1,0,1}; 6 struct State 7 { 8 int x,y,step; 9 }cur,nxt,F,Fnxt; 10 bool vis[66][66],Map[66][66]; 11 queue<State>q; 12 queue<State>Flow; 13 14 void bfs() 15 { 16 cur.x=Sx;cur.y=Sy;cur.step=0; 17 q.push(cur); 18 while(!q.empty()) 19 { 20 int now=q.size(); 21 while(now--) 22 { 23 cur=q.front(); 24 q.pop(); 25 int x=cur.x,y=cur.y; 26 if(!Map[x][y])continue; 27 Map[x][y]=0; 28 for(int i=0;i<4;i++) 29 { 30 int xx=x+To[i],yy=y+To[i+1]; 31 if(xx==Ex && yy==Ey) 32 { 33 printf("%d",cur.step+1); 34 return; 35 } 36 if(xx>n||xx<1||yy>m||yy<1||!Map[xx][yy])continue; 37 nxt.x=xx;nxt.y=yy;nxt.step=cur.step+1; 38 q.push(nxt); 39 } 40 } 41 int tmp=Flow.size(); 42 while(tmp--) 43 { 44 F=Flow.front(); 45 Flow.pop(); 46 for(int i=0;i<4;i++) 47 { 48 int xx=F.x+To[i],yy=F.y+To[i+1]; 49 if(xx>n||xx<1||yy>m||yy<1||!Map[xx][yy])continue; 50 Map[xx][yy]=0; 51 Fnxt.x=xx;Fnxt.y=yy; 52 Flow.push(Fnxt); 53 } 54 } 55 } 56 printf("ORZ hzwer!!!"); 57 return; 58 } 59 60 int main() 61 { 62 freopen("sliker.in","r",stdin); 63 freopen("sliker.out","w",stdout); 64 scanf("%d%d",&n,&m); 65 for(int i=1;i<=n;i++) 66 { 67 char s[66]; 68 scanf("%s",s+1); 69 for(int j=1;j<=m;j++) 70 if(s[j]=='.') 71 Map[i][j]=1; 72 else if(s[j]=='X') 73 Map[i][j]=0; 74 else if(s[j]=='*') 75 { 76 F.x=i;F.y=j; 77 Flow.push(F); 78 Map[i][j]=0; 79 } 80 else if(s[j]=='D') 81 Ex=i,Ey=j; 82 else 83 Sx=i,Sy=j,Map[i][j]=1; 84 } 85 /*for(int i=1;i<=n;i++,printf("\n")) 86 for(int j=1;j<=m;j++) 87 if(Map[i][j]) 88 printf("1 "); 89 else 90 printf("0 ");*/ 91 bfs(); 92 return 0; 93 }