博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

tyvj P1117 拯救ice-cream

Posted on 2010-11-02 19:45  深处的心扉  阅读(507)  评论(0)    收藏  举报
背景 Background

天好热……Tina顶着那炎炎的烈日,向Ice-cream home走去……
可是……停电了……
冰淇淋们躺在Ice-cream home的冰柜里,慢慢地……慢慢地……融化…………
你说,她能赶在冰淇淋融化完之前赶到Ice-cream home去吗?

 


描述 Description
给你一张坐标图,s为Tina的初始位置,m为Ice-cream home的位置,‘.’为路面,Tina在上面,每单位时间可以移动一格;‘#’为草地,Tina在上面,每两单位时间可以移动一格(建议不要模仿—毕竟Tina还小);‘o’是障碍物,Tina不能在它上面行动。也就是说,Tina只能在路面或草地上行走,必须绕过障碍物,并到达冰淇淋店。但是…………不保证到达时,冰淇淋还未融化,所以……就请聪明的你……选择最佳的方案啦…………如果,Tina到的时候,冰淇淋已经融化完了,那她可是会哭的。


输入格式 Input Format
依次输入冰淇淋的融化时间t(0<t<1000),坐标图的长x,宽y(5<=x,y<=25){太长打起来好累……},和整张坐标图。


输出格式 Output Format
判断按照最优方案是否可以赶在冰淇淋融化之前到达冰淇淋店(注:当T=最优方案所用时间,则判断为未赶到),如赶到,输出所用时间;如未赶到,输出Tina的哭声——“55555”(不包括引号)。


样例输入 Sample Input

11
10
8
......s...
..........
#ooooooo.o
#.........
#.........
#.........
#.....m...
#.........

样例输出 Sample Output

10


时间限制 Time Limitation
  各个测试点1s

 

分析:一个二维的宽搜题目………………

1 program p1117;
2 const dx:array[1..4]of integer=(1,-1,0,0);
3 dy:array[1..4]of integer=(0,0,-1,1);
4 var
5 b:array[0..10000]of record
6 x,y:longint;
7 end;
8 f:array[0..30,0..30]of longint;
9 a:array[0..30,0..30]of char;
10 time,n,m,x1,y1,x2,y2:longint;
11
12 procedure init;
13 var i,j:longint;
14 begin
15 readln(time);
16 readln(n);
17 readln(m);
18 fillchar(a,sizeof(a),'$');
19 filldword(f,sizeof(f)div 4,maxlongint);
20 for i:=1 to m do //一开始写的是for i:=1 to n do ^^^^^ for j:=1 to m do 导致结果错误,囧……
21 begin
22 for j:=1 to n do
23 begin
24 read(a[i,j]);
25 if a[i,j]='s' then
26 begin
27 x1:=i;
28 y1:=j;
29 end;
30 if a[i,j]='m' then
31 begin
32 x2:=i;
33 y2:=j;
34 end;
35 end;
36 readln;
37 end;
38 end;
39
40 procedure bfs;
41 var i,j,head,tail:longint;
42 begin
43 head:=1;
44 tail:=1;
45 f[x1,y1]:=0;
46 b[head].x:=x1;
47 b[head].y:=y1;
48 while head<=tail do
49 begin
50 for i:=1 to 4 do
51 begin
52 if (a[b[head].x+dx[i],b[head].y+dy[i]]='.')
or
(a[b[head].x+dx[i],b[head].y+dy[i]]='m') then
53 if f[b[head].x+dx[i],b[head].y+dy[i]]>f[b[head].x,b[head].y]+1 then
54 begin
55 f[b[head].x+dx[i],b[head].y+dy[i]]:=f[b[head].x,b[head].y]+1;
56 inc(tail);
57 b[tail].x:=b[head].x+dx[i];
58 b[tail].y:=b[head].y+dy[i];
59 end;
60 if (a[b[head].x+dx[i],b[head].y+dy[i]]='#') then
61 if (f[b[head].x+dx[i],b[head].y+dy[i]]>f[b[head].x,b[head].y]+2) then
62 begin
63 f[b[head].x+dx[i],b[head].y+dy[i]]:=f[b[head].x,b[head].y]+2;
64 inc(tail);
65 b[tail].x:=b[head].x+dx[i];
66 b[tail].y:=b[head].y+dy[i];
67 end;
68 end;
69 inc(head);
70 end;
71 end;
72
73 begin
74 init;
75 bfs;
76 writeln(f[x2,y2]);
77 end.
78