得分: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 }
AC

相关文章: