vijos p1340(拯救ice-cream)

今天基本上一个晚上的时间都花在这道题目了,感觉是一道典型的 BFS,主要时间花在判重的方法上了;

一开始没判重,而且每比较,所以得不到最短时间.....

一开始是在每个坐标上设布尔值,若走过此地则 布尔:=false; 后来发现根本不行,因为路径不同,也可能走过同一个地方;

后来 zyt 大牛灵光一现,我茅塞顿开,其实可以在每个坐标上记录从起点到该坐标的最短时间(首先要预处理,否则都为0了),如果当前所用时间小于记录时间,则记录时间等于当前时间,继续此次操作;否则停止这次操作,进行下一次操作;

感觉对搜索越来越熟悉了,程序是需要练的啊........

恩...贴一下代码......

 1 program P1340;
 2 type
 3         rec=record
 4                 x,y:longint;
 5                 di:longint;
 6                 time:longint;
 7         end;
 8 var
 9         s:array[1..100000,1..4] of longint;
10         time:array[1..30,1..30] of longint;
11         a:array[1..30,1..30] of char;
12         sb1,sb2:char;
13         b:array[1..30,1..30] of longint;
14         q,open,closed,t,x,y,x0,y0,x1,y1,i,j,k,l,m:longint;
15 begin
16         q:=maxlongint;
17         readln(t);
18         read(x,y);
19         for j:=1 to y do
20                 begin
21                 read(sb1,sb2);
22                  for i:=1 to x do
23                         begin
24                                 read(a[i,j]);
25                                 if a[i,j]='.'then b[i,j]:=1
26                                         else if a[i,j]='#'then b[i,j]:=2
27                                                 else if a[i,j]='o' then b[i,j]:=maxlongint
28                                                         else if a[i,j]='s' then begin x0:=i;y0:=j; b[i,j]:=1;end
29                                                         else if a[i,j]='m' then begin x1:=i;y1:=j; b[i,j]:=0;end;
30                         end;
31                  end;
32         for j:=1 to y do
33                 for i:=1 to x do
34                         time[i,j]:=maxlongint;
35         closed:=0; open:=1;
36         s[1,1]:=x0; s[1,2]:=y0; s[1,3]:=0; s[1,4]:=0;
37         repeat
38         repeat
39                 inc(closed);
40                 if time[s[closed,1],s[closed,2]]>s[closed,4] then begin
41                 time[s[closed,1],s[closed,2]]:=s[closed,4];
42                 if (s[closed,3]<>1)and(s[closed,1]<x)and(a[s[closed,1]+1,s[closed,2]]<>'o')then begin
43                                                                 inc(open);
44                                                                 s[open,1]:=s[closed,1]+1;
45                                                                 s[open,2]:=s[closed,2];
46                                                                 s[open,3]:=3;
47                                                                 s[open,4]:=s[closed,4]+b[s[closed,1],s[closed,2]];
48                                                                 end;
49                                                                 if a[s[open,1],s[open,2]]='m' then break;
50                 if (s[closed,3]<>3)and(s[closed,1]>1)and(a[s[closed,1]-1,s[closed,2]]<>'o') then begin
51                                                                 inc(open);
52                                                                 s[open,1]:=s[closed,1]-1;
53                                                                 s[open,2]:=s[closed,2];
54                                                                 s[open,3]:=1;
55                                                                 s[open,4]:=s[closed,4]+b[s[closed,1],s[closed,2]];
56                                                                 end;
57                                                                 if a[s[open,1],s[open,2]]='m' then break;
58                 if (s[closed,3]<>0)and(s[closed,2]>1)and(a[s[closed,1],s[closed,2]-1]<>'o') then begin
59                                                                 inc(open);
60                                                                 s[open,1]:=s[closed,1];
61                                                                 s[open,2]:=s[closed,2]-1;
62                                                                  s[open,3]:=2;
63                                                                 s[open,4]:=s[closed,4]+b[s[closed,1],s[closed,2]];
64                                                                 end;
65                                                                 if a[s[open,1],s[open,2]]='m' then break;
66                 if (s[closed,3]<>2)and(s[closed,2]<y)and(a[s[closed,1],s[closed,2]+1]<>'o') then begin
67                                                                 inc(open);
68                                                                 s[open,1]:=s[closed,1];
69                                                                 s[open,2]:=s[closed,2]+1;
70                                                                 s[open,3]:=0;
71                                                                 s[open,4]:=s[closed,4]+b[s[closed,1],s[closed,2]];
72                                                                 end;
73                                                                 if a[s[open,1],s[open,2]]='m' then break;
74                 end;
75         until (a[s[open,1],s[open,2]]='m')or(closed=open);
76         if q>s[open,4] then q:=s[open,4];
77         until (closed=open);
78         if q>=t then write('55555')
79         else
80         write(q);
81 end. 
posted @ 2012-10-05 22:07  改名字干什么  阅读(212)  评论(0编辑  收藏  举报