tyvj p1117 拯救ice-cream

P1117 - 拯救ice-cream

From smartc    Normal (OI) 总时限:5s    内存限制:128MB

背景 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到的时候,冰淇淋已经融化完了,那她可是会哭的。

输入格式 InputFormat

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

输出格式 OutputFormat

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

样例输入 SampleInput [复制数据]

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

样例输出 SampleOutput [复制数据]

10

时间限制 TimeLimitation

各个测试点1s
program tyvj1117;
type node=record
   a,b,time:longint;
   end;
var a:array[0..26,0..26] of integer;
   q:array[1..625] of node;
   d:array[1..4] of integer=(1,0,-1,0);
   l:array[1..4] of integer=(0,-1,0,1);
   mark:array[0..26,0..26] of boolean;
   head,tail,t,x,y,i,j:longint;
   k,first,final:node;
   st:string;
procedure push(a,b,t:longint);
begin
inc(head);
q[head].a:=a;
q[head].b:=b;
q[head].time:=t;
mark[a,b]:=true;
end;
function pop:node;
begin
pop:=q[tail];
inc(tail);
end;
begin
fillchar(a,sizeof(a),3);
fillchar(mark,sizeof(mark),false);
readln(t);
readln(x,y);
for i:=1 to y do begin
 readln(st);
 for j:=1 to x do begin
  case(st[j]) of
  '.':a[i,j]:=1;
  '0':a[i,j]:=3;
  '#':a[i,j]:=2;
  'm':begin
   first.a:=i;first.b:=j;
   a[i,j]:=1;
   end;
  's':begin
   final.a:=i;final.b:=j;
   a[i,j]:=1;
   end;
  end;
 end;
end;
head:=0;tail:=1;
push(first.a,first.b,0);
while head>=tail do begin
 k:=pop;
 if (k.a=final.a) and(k.b=final.b) then begin
  if k.time<t then  writeln(k.time)
   else writeln(55555);
   halt;
  end;
 if a[k.a,k.b]=2 then begin
  a[k.a,k.b]:=1;
  push(k.a,k.b,k.time);
  end
  else begin
  for i:=1 to 4 do
    if(a[k.a+d[i],k.b+l[i]]<=2) and(not mark[k.a+d[i],k.b+l[i]]) then
     push(k.a+d[i],k.b+l[i],k.time+a[k.a+d[i],k.b+l[i]]);
     end;
 end;
 writeln('55555');
end.

posted on 2012-10-17 21:17  馒头~blue  阅读(342)  评论(0)    收藏  举报

导航