今天基本上一个晚上的时间都花在这道题目了,感觉是一道典型的 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.