讨论 / 第8,9个数据怎么这么大?
Mato完整版 2008-12-08 06:07:00
点我顶贴 收藏 删除
O(n^2)的BFS都过不去。
#1 Mato战胜wish@2008-12-08 06:07:00
回复 删除
我的程序:

{$H+}

CONST

xa: ARRAY[1..4] OF LONGINT = (1, 0, -1, 0);

ya: ARRAY[1..4] OF LONGINT = (0, 1, 0, -1);

xb: ARRAY[1..4] OF LONGINT = (2, 0, -2, 0);

yb: ARRAY[1..4] OF LONGINT = (0, 2, 0, -2);

xc: ARRAY[1..4] OF LONGINT = (1, 1, -1, -1);

yc: ARRAY[1..4] OF LONGINT = (1, -1, 1, -1);

TYPE

poi = RECORD

x, y: LONGINT;

END;

VAR

a: ARRAY[1..1400] OF STRING;

b, b2: ARRAY[1..1400, 1..1400] OF LONGINT;

q: ARRAY[1..1960000] OF poi;

n, res, res2, front, rear: LONGINT;

PROCEDURE init;

VAR

i, j: LONGINT;

BEGIN

READLN(n);

FOR i:=1 TO n DO READLN(a[i]);

res := MAXLONGINT; res2 := MAXLONGINT;

END;

PROCEDURE xxx;

VAR

i, tx, ty, tx2, ty2, tb, tb2, r1, r2: LONGINT;

BEGIN

r1 := -1; r2 := MAXLONGINT;

REPEAT

tx := q[front].x; ty := q[front].y;

tb := b[tx, ty]; tb2 := b2[tx, ty];

IF tb = r1 THEN BREAK;

IF a[tx, ty] = ’A’ THEN

FOR i:=1 TO 4 DO BEGIN

tx2 := tx + xa[i]; ty2 := ty + ya[i];

IF (tx2 < 1) OR (tx2 > n) THEN CONTINUE;

IF (ty2 < 1) OR (ty2 > n) THEN CONTINUE;

IF a[tx2, ty2] = ’*’ THEN CONTINUE;

IF b[tx2, ty2] <> 0 THEN

IF (tb + 1 > b[tx2, ty2]) OR (tb + 1 = b[tx2, ty2]) AND (tb2 + 1 > b2[tx2, ty2]) THEN CONTINUE;

IF b[tx2, ty2] = 0 THEN BEGIN

INC(rear);

q[rear].x := tx2; q[rear].y := ty2;

END;

b[tx2, ty2] := tb + 1;

b2[tx2, ty2] := tb2 + 1;

IF (tx2 = n) AND (ty2 = n) THEN BEGIN

r1 := tb + 1;

IF r1 > res THEN EXIT;

IF tb2 + 1 < r2 THEN r2 := tb2 + 1;

END;

END;

IF a[tx, ty] = ’B’ THEN

FOR i:=1 TO 4 DO BEGIN

tx2 := tx + xb[i]; ty2 := ty + yb[i];

IF (tx2 < 1) OR (tx2 > n) THEN CONTINUE;

IF (ty2 < 1) OR (ty2 > n) THEN CONTINUE;

IF a[tx2, ty2] = ’*’ THEN CONTINUE;

IF b[tx2, ty2] <> 0 THEN

IF (tb + 1 > b[tx2, ty2]) OR (tb + 1 = b[tx2, ty2]) AND (tb2 + 1 > b2[tx2, ty2]) THEN CONTINUE;

IF b[tx2, ty2] = 0 THEN BEGIN

INC(rear);

q[rear].x := tx2; q[rear].y := ty2;

END;

b[tx2, ty2] := tb + 1;

b2[tx2, ty2] := tb2 + 1;

IF (tx2 = n) AND (ty2 = n) THEN BEGIN

r1 := tb + 1;

IF r1 > res THEN EXIT;

IF tb2 + 1 < r2 THEN r2 := tb2 + 1;

END;

END;

IF a[tx, ty] = ’C’ THEN

FOR i:=1 TO 4 DO BEGIN

tx2 := tx + xc[i]; ty2 := ty + yc[i];

IF (tx2 < 1) OR (tx2 > n) THEN CONTINUE;

IF (ty2 < 1) OR (ty2 > n) THEN CONTINUE;

IF a[tx2, ty2] = ’*’ THEN CONTINUE;

IF b[tx2, ty2] <> 0 THEN

IF (tb + 1 > b[tx2, ty2]) OR (tb + 1 = b[tx2, ty2]) AND (tb2 + 2 > b2[tx2, ty2]) THEN CONTINUE;

IF b[tx2, ty2] = 0 THEN BEGIN

INC(rear);

q[rear].x := tx2; q[rear].y := ty2;

END;

b[tx2, ty2] := tb + 1;

b2[tx2, ty2] := tb2 + 2;

IF (tx2 = n) AND (ty2 = n) THEN BEGIN

r1 := tb + 1;

IF r1 > res THEN EXIT;

IF tb2 + 2 < r2 THEN r2 := tb2 + 2;

END;

END;

INC(front);

UNTIL front > rear;

IF r1 = -1 THEN EXIT;

IF (r1 < res) OR (r1 = res) AND (r2 < res2) THEN BEGIN

res := r1; res2 := r2;

END;

END;

BEGIN

init;

IF (n = 1) AND (a[1, 1] <> ’*’) THEN BEGIN WRITE(1); HALT; END;

FILLCHAR(b, SIZEOF(b), 0);

front := 1; rear := 1;

b[1, 1] := 1; b2[1, 1] := 1;

q[1].x := 1; q[1].y := 1;

xxx;

FILLCHAR(b, SIZEOF(b), 0);

front := 1; rear := 1;

b[1, n] := 1; b2[1, n] := 1;

q[1].x := 1; q[1].y := n;

xxx;

FILLCHAR(b, SIZEOF(b), 0);

front := 1; rear := 1;

b[n, 1] := 1; b2[n, 1] := 1;

q[1].x := n; q[1].y := 1;

xxx;

IF res = MAXLONGINT THEN WRITE(’No answer’) ELSE WRITE(res2);

END.

查看更多回复
提交回复