BFS 机器人搬重物





机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个N*M的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动1步(Creep);向前移动2步(Walk);向前移动3步(Run);向左转(Left);向右转(Right)。每个指令所需要的时间为1秒。请你计算一下机器人完成任务所需的最少时间。
输入格式:
输入的第一行为两个正整数N,M(N,M<=50),下面N行是储藏室的构造,0表示无障碍,1表示有障碍,数字之间用一个空格隔开。接着一行有四个整数和一个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东E,南S,西W,北N),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
输出格式:
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出-1。

BFS 机器人搬重物_第1张图片
input
9 10
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
7 2 2 7 S
output 
12

var a:array[-2..54,-2..54]of 0..1;
p:array[-2..53,-2..53,1..4]of longint;
x,y,time:array[1..10000]of longint;
f:array[1..10000]of char;
n,m,i,j,o,k,t,w,xx,yy,zz:longint;
c:char;
s,ss:string;
function ty(c:char):longint;
begin
  if c='E' then exit(1);
  if c='S' then exit(2);
  if c='W' then exit(3);
  if c='N' then exit(4);
end;
function turn(c:char;x:longint):char;
begin
  if x=1 then
  begin
    if c='E' then exit('N');
    if c='S' then exit('E');
    if c='W' then exit('S');
    if c='N' then exit('W');
  end;
  if x=2 then
  begin
    if c='E' then exit('S');
    if c='S' then exit('W');
    if c='W' then exit('N');
    if c='N' then exit('E');
  end;
end;
function robot(x,y:longint):boolean;
begin
  if(x+1>n)or(y+1>m) then exit(false); 
  if a[x,y]=1 then exit(false);
  if a[x+1,y]=1 then exit(false);
  if a[x,y+1]=1 then exit(false);
  if a[x+1,y+1]=1 then exit(false);
  exit(true);
end;
begin
  readln(n,m);
  for i:=1 to n do
  begin
    for j:=1 to n do read(a[i,j]);
    readln;
  end;
  readln(s);
  while pos(' ',s)<>0 do
  begin
    inc(o);
    ss:=copy(s,1,pos(' ',s)-1);
    if o=1 then val(ss,x[1]);
    if o=2 then val(ss,y[1]);
    if o=3 then val(ss,xx);
    if o=4 then val(ss,yy);
    delete(s,1,pos(' ',s));
  end;
  f[1]:=s[1];
  p[x[1],y[1],ty(f[1])]:=1;
  t:=0;
  w:=1;
  while t<w do
  begin
    inc(t);
    if(x[t]=xx)and(y[t]=yy) then
    begin
      writeln(time[t]);
      halt;
    end;
    i:=x[t];
    j:=y[t];
    c:=f[t];
    if p[i,j,ty(turn(c,1))]=0 then
    begin
      inc(w);
      x[w]:=i;
      y[w]:=j;
      f[w]:=turn(c,1);
      time[w]:=time[t]+1;
      p[i,j,ty(turn(c,1))]:=1;
    end;
    if p[i,j,ty(turn(c,2))]=0 then
    begin
      inc(w);
      x[w]:=i;
      y[w]:=j;
      f[w]:=turn(c,2);
      time[w]:=time[t]+1;
      p[i,j,ty(turn(c,2))]:=1;
    end;
    if c='E' then
    begin
      if(p[i,j+1,1]=0)and(j+1<=m)and(robot(i,j+1)) then
      begin
        inc(w);
        x[w]:=i;
        y[w]:=j+1;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i,j+1,1]:=1;
      end;
      if(p[i,j+2,1]=0)and(j+2<=m)and(robot(i,j+1))and(robot(i,j+2)) then
      begin
        inc(w);
        x[w]:=i;
        y[w]:=j+2;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i,j+2,1]:=1;
      end;
      if(p[i,j+3,1]=0)and(j+3<=m)and(robot(i,j+1))and(robot(i,j+2))and(robot(i,j+3)) then
      begin
        inc(w);
        x[w]:=i;
        y[w]:=j+3;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i,j+3,1]:=1;
      end;
    end;
    if c='W' then
    begin
      if(p[i,j-1,3]=0)and(j-1>=1)and(robot(i,j-1)) then
      begin
        inc(w);
        x[w]:=i;
        y[w]:=j-1;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i,j-1,3]:=1;
      end;
      if(p[i,j-2,3]=0)and(j-2>=1)and(robot(i,j-1))and(robot(i,j-2)) then
      begin
        inc(w);
        x[w]:=i;
        y[w]:=j-2;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i,j-2,3]:=1;
      end;
      if(p[i,j-3,3]=0)and(j-3>=1)and(robot(i,j-1))and(robot(i,j-2))and(robot(i,j-3)) then
      begin
        inc(w);
        x[w]:=i;
        y[w]:=j-3;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i,j-3,3]:=1;
      end;
    end;
    if c='S' then
    begin
       if(p[i+1,j,2]=0)and(i+1<=n)and(robot(i+1,j)) then
      begin
        inc(w);
        x[w]:=i+1;
        y[w]:=j;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i+1,j,2]:=1;
      end;
      if(p[i+2,j,2]=0)and(i+2<=n)and(robot(i+1,j))and(robot(i+2,j)) then
      begin
        inc(w);
        x[w]:=i+2;
        y[w]:=j;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i+2,j,2]:=1;
      end;
      if(p[i+3,j,2]=0)and(i+3<=n)and(robot(i+1,j))and(robot(i+2,j))and(robot(i+3,j)) then
      begin
        inc(w);
        x[w]:=i+3;
        y[w]:=j;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i+3,j,2]:=1;
      end;
    end;
    if c='N' then
    begin
      if(p[i-1,j,4]=0)and(i-1>=1)and(robot(i-1,j)) then
      begin
        inc(w);
        x[w]:=i-1;
        y[w]:=j;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i-1,j,4]:=1;
      end;
      if(p[i-2,j,4]=0)and(i-2>=1)and(robot(i-1,j))and(robot(i-2,j)) then
      begin
        inc(w);
        x[w]:=i-2;
        y[w]:=j;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i-2,j,4]:=1;
      end;
      if(p[i-3,j,4]=0)and(i-3>=1)and(robot(i-1,j))and(robot(i-2,j))and(robot(i-3,j)) then
      begin
        inc(w);
        x[w]:=i-3;
        y[w]:=j;
        f[w]:=c;
        time[w]:=time[t]+1;
        p[i-3,j,4]:=1;
      end;
    end;
  end;
  writeln('-1');
end.






你可能感兴趣的:(搜索,pascal,bfs,广搜,noip)