CARGO ( ã ra trong b đ Tin h c tr TP. à N ng 2008 - B ng C (THPT))Đ ộ ề ọ ẻ Đ ẵ ả
Bản đồ một kho hàng hình chữ nhật kích thước mxn được chia thành các ô vuông đơn vị (m
hàng, n cột: các hàng đánh số từ trên xuống dưới, các cột đánh số từ trái qua phải). Trên các ô
của bản đồ có một số ký hiệu:
•Các ký hiệu # đánh dấu các ô đã có một kiện hàng xếp sẵn,
•Một ký hiệu *: Đánh dấu ô đang có một xe đẩy
•Một ký hiệu $: Đánh dấu ô chứa kiện hàng cần xếp
•Một ký hiệu @: Đánh dấu vị trí ô mà cần phải xếp kiện hàng B vào ô đó
•Các ký hiệu dấu chấm ".": Cho biết ô đó trống
Cần phải dùng xe đẩy ở * để đẩy kiện hàng ở $ đến vị trí @ sao cho trong quá trình di
chuyển cũng như đẩy hàng, không chạm vào những kiện hàng đã được xếp sẵn. (Xe
đẩy có thể di chuyển sang một trong 4 ô chung cạnh với ô đang đứng). Nếu có nhiều
phương án thì chỉ ra một phương án sao cho xe đẩy phải di chuyển qua ít bước nhất.
Các hướng di chuyển được chỉ ra trong hình dưới đây
This image has been resized. Click this bar to view the full image. The original image is sized 774x401
and weights 48KB.
Dữ liệu: Vào từ file văn bản CARGO.INP
•Dòng 1: Ghi hai số nguyên dương m, n cách nhau một dấu cách (m, n ≤ 80)
•m dòng tiếp theo, dòng thứ i ghi đủ n ký hiệu trên hàng thứ i của bản đồ theo đúng thứ tự từ
trái qua phải. Các ký hiệu được ghi liền nhau
Kết quả: Ghi ra file văn bản CARGO.OUT
•Dòng 1: Ghi số bước di chuyển xe đẩy để thực hiện mục đích yêu cầu, nếu không có phương án
khả thi thì dòng này ghi số -1
•Dòng 2: Nếu có phương án khả thi thì dòng này ghi các ký tự liền nhau thể hiện hướng di
chuyển của xe đẩy R (East, West, South, North). Các chữ cái thường (e,w,s,n) thể hiện bước
di chuyển không đẩy hàng, các chữ cái in hoa (E,W,S,N) thể hiện bước di chuyển có đẩy hàng.
Ví dụ:
This image has been resized. Click this bar to view the full image. The original image is sized 987x274
and weights 31KB.
{$M 65520,0,655360}
program CargoMove;
const
InputFile = 'CARGO.IN5';
OutputFile = 'CARGO.OUT';
max = 80;
maxC = max * max * 4 + 1;
DName: array[1..4] of Char = 'SEWN';
DLName: array[1..4] of Char = 'sewn';
dx: array[1..4] of ShortInt = (1, 0, 0, -1);
dy: array[1..4] of ShortInt = (0, 1, -1, 0);
type
THeapArr = array[1..max * max * 4] of ShortInt;
TWBoard = array[1..4, 1..max, 1..max] of Integer;
TBBoard = array[1..4, 1..max, 1..max] of ShortInt;
var
m, n: Integer;
a: array[0..max + 1, 0..max + 1] of Char;
heapX, heapY, heapK: ^THeapArr;
d, pos: ^TWBoard;
Trace: ^TBBoard;
TraceBFS: array[1..max, 1..max] of ShortInt;
nHeap: Integer;
XS, YS, kD, XD, YD, XR, YR: Integer;
res: LongInt;
procedure Enter;
var
f: Text;
i, j: Integer;
begin
FillChar(a, SizeOf(a), '#');
Assign(f, InputFile); Reset(f);
readln(f, m, n);
XS := 0; YS := 0;
XD := 0; YD := 0;
for i := 1 to m do
begin
for j := 1 to n do
begin
Read(f, a[i, j]);
case a[i, j] of
'@':
begin
XD := i; YD := j;
end;
'$':
begin
XS := i; YS := j;
end;
'*':
begin
XR := i; YR := j;
end;
end;
end;
Readln(f);
end;
Close(f);
end;
function NodeValue(iHeap: Integer): Integer;
begin
NodeValue := d^[heapK^[iHeap], heapX^[iHeap], heapY^[iHeap]];
end;
procedure SetNodeValue(iHeap, k, x, y: Integer);
begin
heapK^[iHeap] := k;
heapX^[iHeap] := x;
heapY^[iHeap] := y;
Pos^[k, x, y] := iHeap;
end;
procedure Push(k, x, y: Integer);
var
r, c: Integer;
begin
c := Pos^[k, x, y];
if c = 0 then
begin
Inc(nHeap);
c := nHeap;
end;
r := c div 2;
while (r > 0) and (NodeValue(r) > d^[k, x, y]) do
begin
SetNodeValue(c, heapK^[r], heapX^[r], heapY^[r]);
c := r;
r := c div 2;
end;
SetNodeValue(c, k, x, y);
end;
function Valid(k, x, y: Integer): Boolean;
begin
Valid := a[x + dx[k], y + dy[k]] <> '#';
end;
procedure Init;
var
k, x, y: Integer;
begin
New(d);
for k := 1 to 4 do
begin
for x := 1 to m do
for y := 1 to n do d^[k, x, y] := MaxC;
end;
New(pos);
FillChar(pos^, SizeOf(pos^), 0);
New(heapK); New(heapX); New(heapY);
nHeap := 0;
for k := 1 to 4 do
if Valid(k, XD, YD) then
begin
d^[k, XD, YD] := 0;
Push(k, XD, YD);
end;
New(Trace);
end;
procedure Pop(var pk, px, py: Integer);
var
tk, tx, ty: Integer;
r, c: Integer;
begin
pk := heapK^[1]; px := heapX^[1]; py := heapY^[1];
pos^[pk, px, py] := -1;
tk := heapK^[nHeap]; tx := heapX^[nHeap]; ty := heapY^[nHeap];
Dec(nHeap);
r := 1;
while r * 2 <= nHeap do
begin