机器人搬重物pascal

来源:百度知道 编辑:UC知道 时间:2024/09/20 21:23:39
机器人搬重物
源程序名 ROBOT.??? (PAS,C,CPP)
可执行文件名 ROBOT.EXE
输入文件名 ROBOT.IN
输出文件名 ROBOT.OUT

机器人移动学会(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。

样例
ROBOT.IN
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

ROBOT.OUT
12

const
dx:array[0..3]of longint=(0,1,0,-1);
dy:array[0..3]of longint=(1,0,-1,0);
var
map,nmap:array[0..50,0..50]of longint;
stp:array[0..50,0..50,0..3]of longint;
m,n,mins,bi,bj,ei,ej,d,i,j,k:longint;
p:boolean;
dir:char;
begin
readln(m,n);
for i:=1 to m do
for j:=1 to n do
read(map[i,j]);
for i:=1 to m-1 do
for j:=1 to n-1 do
if (map[i,j]=0) and (map[i,j+1]=0) and (map[i+1,j]=0) and (map[i+1,j+1]=0) then
nmap[i,j]:=1;
read(bi,bj,ei,ej,dir,dir);
case dir of
'E':d:=0;
'S':d:=1;
'W':d:=2;
'N':d:=3;
end;
fillchar(stp,sizeof(stp),$7f);
if nmap[bi,bj]=1
then stp[bi,bj,d]:=0;
p:=true;
while p do
begin
p:=false;
for i:=1 to m-1 do
for j:=1 to n-1 d