Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
该死的题什么数据都试过了,还是WA, 是不是题目看错了,或是格式问题? 附代码:(Pascal) CONST p1: ARRAY[1..8] OF LONGINT = (-1, -1, -1, 0, 0, 1, 1, 1); p2: ARRAY[1..8] OF LONGINT = (-1, 0, 1, -1, 1, -1, 0, 1); VAR n, m, z1, st0, sr0: LONGINT; x1, y1, x2, y2, num: ARRAY[1..1000] OF LONGINT; rn, rkk: ARRAY[1..1000000] OF LONGINT; PROCEDURE f01(kk: LONGINT; VAR x0, y0: LONGINT); BEGIN x0 := kk DIV m + 1; y0 := kk MOD m; IF y0 = 0 THEN BEGIN y0 := m; DEC(x0); END; END; PROCEDURE f02(x0, y0: LONGINT; VAR kk: LONGINT); BEGIN kk := (x0 - 1) * m + y0; END; PROCEDURE init; VAR i, k0: LONGINT; BEGIN READLN(m); IF m = 0 THEN BEGIN WRITELN(0); HALT; END; k0 := 1; st0 := 0; WHILE TRUE DO BEGIN INC(st0); READLN(num[st0], i); IF (num[st0] = 0) AND (i = 0) THEN BEGIN DEC(st0); BREAK; END; f01(k0, x1[st0], y1[st0]); f01(k0 + i - 1, x2[st0], y2[st0]); k0 := k0 + i; END; DEC(k0); n := k0 DIV m; sr0 := 0; z1 := k0 MOD m; IF z1 = 0 THEN z1 := m ELSE INC(n); END; PROCEDURE add(nm0, k0: LONGINT); BEGIN IF sr0 = 0 THEN BEGIN INC(sr0); rn[sr0] := nm0; rkk[sr0] := k0; EXIT; END; IF nm0 = rn[sr0] THEN INC(rkk[sr0], k0) ELSE BEGIN INC(sr0); rn[sr0] := nm0; rkk[sr0] := k0; END; END; FUNCTION se1(x0, y0, ii: LONGINT): LONGINT; VAR i, kk0, kk1, kk2: LONGINT; BEGIN f02(x0, y0, kk0); FOR i:=ii DOWNTO 1 DO BEGIN f02(x1[i], y1[i], kk1); f02(x2[i], y2[i], kk2); IF (kk0 >= kk1) AND (kk0 <= kk2) THEN EXIT(i); END; END; FUNCTION se2(x0, y0, ii: LONGINT): LONGINT; VAR i, kk0, kk1, kk2: LONGINT; BEGIN f02(x0, y0, kk0); FOR i:=ii TO st0 DO BEGIN f02(x1[i], y1[i], kk1); f02(x2[i], y2[i], kk2); IF (kk0 >= kk1) AND (kk0 <= kk2) THEN EXIT(i); END; END; PROCEDURE xx1(x0, y0, nm0, ii: LONGINT); VAR i: LONGINT; x00, y00, t, max: LONGINT; BEGIN max := 0; FOR i:=1 TO 8 DO BEGIN x00 := x0 + p1[i]; y00 := y0 + p2[i]; IF (x00 < 1) OR (x00 > n) THEN CONTINUE; IF (y00 < 1) OR (y00 > m) THEN CONTINUE; IF (x00 = n) AND (y00 > z1) THEN CONTINUE; IF i <= 4 THEN t := se1(x00, y00, ii) ELSE t := se2(x00, y00, ii); IF ABS(num[t] - nm0) > max THEN max := ABS(num[t] - nm0); END; add(max, 1); END; PROCEDURE xx2(i, j1, j2, nm0, ii: LONGINT); VAR sq1, sq2, k0, k1, k2, a1, a2: LONGINT; BEGIN IF (i = 1) AND (i = n) THEN BEGIN xx1(i, j1, nm0, ii); IF j2 - j1 > 1 THEN add(0, j2 - j1 - 1); IF j2 > j1 THEN xx1(i, j2, nm0, ii); EXIT; END; IF i = 1 THEN BEGIN sq2 := se2(i + 1, j1, ii); k0 := j1; REPEAT IF x2[sq2] > i + 1 THEN BEGIN xx1(i, k0, nm0, ii); IF j2 - k0 > 1 THEN add(ABS(nm0 - num[sq2]), j2 - k0 - 1); IF j2 > k0 THEN xx1(i, j2, nm0, ii); EXIT; END ELSE BEGIN IF y2[sq2] >= j2 THEN BEGIN xx1(i, k0, nm0, ii); IF j2 - k0 > 1 THEN add(ABS(nm0 - num[sq2]), j2 - k0 - 1); IF j2 > k0 THEN xx1(i, j2, nm0, ii); EXIT; END; xx1(i, k0, nm0, ii); IF y2[sq2] - k0 > 1 THEN add(ABS(nm0 - num[sq2]), y2[sq2] - k0 - 1); IF y2[sq2] > k0 THEN xx1(i, y2[sq2], nm0, ii); INC(sq2); k0 := y1[sq2]; END; UNTIL FALSE; EXIT; END; IF (i = n) OR ((i = n - 1) AND (j1 > z1)) THEN BEGIN sq1 := se1(i - 1, j1, ii); k0 := j1; REPEAT IF x2[sq1] > i - 1 THEN BEGIN xx1(i, k0, nm0, ii); IF j2 - k0 > 1 THEN add(ABS(nm0 - num[sq1]), j2 - k0 - 1); IF j2 > k0 THEN xx1(i, j2, nm0, ii); EXIT; END ELSE BEGIN IF y2[sq1] >= j2 THEN BEGIN xx1(i, k0, nm0, ii); IF j2 - k0 > 1 THEN add(ABS(nm0 - num[sq1]), j2 - k0 - 1); IF j2 > k0 THEN xx1(i, j2, nm0, ii); EXIT; END; xx1(i, k0, nm0, ii); IF y2[sq1] - k0 > 1 THEN add(ABS(nm0 - num[sq1]), y2[sq1] - k0 - 1); IF y2[sq1] > k0 THEN xx1(i, y2[sq1], nm0, ii); INC(sq1); k0 := y1[sq1]; END; UNTIL FALSE; EXIT; END; sq1 := se1(i - 1, j1, ii); sq2 := se2(i + 1, j1, ii); k0 := j1; REPEAT k1 := y2[sq1]; k2 := y2[sq2]; IF x2[sq1] > i - 1 THEN k1 := j2; IF x2[sq2] > i + 1 THEN k2 := j2; IF k1 >= k2 THEN BEGIN xx1(i, k0, nm0, ii); IF k2 - k0 > 1 THEN BEGIN a1 := ABS(nm0 - num[sq1]); a2 := ABS(nm0 - num[sq2]); IF a1 > a2 THEN add(a1, k2 - k0 - 1) ELSE add(a2, k2 - k0 - 1); END; IF k2 > k0 THEN xx1(i, k2, nm0, ii); IF k2 = j2 THEN EXIT; INC(sq2); IF k1 = k2 THEN INC(sq1); k0 := k2 + 1; END ELSE BEGIN xx1(i, k0, nm0, ii); IF k1 - k0 > 1 THEN BEGIN a1 := ABS(nm0 - num[sq1]); a2 := ABS(nm0 - num[sq2]); IF a1 > a2 THEN add(a1, k1 - k0 - 1) ELSE add(a2, k1 - k0 - 1); END; IF k1 > k0 THEN xx1(i, k1, nm0, ii); IF k1 = j2 THEN EXIT; INC(sq1); k0 := k1 + 1; END; UNTIL FALSE; END; PROCEDURE xx3(i, j1, j2, nm0, ii: LONGINT); BEGIN IF (i = n - 1) AND (j1 <= z1) AND (j2 > z1) THEN BEGIN xx2(i, j1, z1, nm0, ii); xx2(i, z1 + 1, j2, nm0, ii); END ELSE xx2(i, j1, j2, nm0, ii); END; PROCEDURE xxx; VAR i: LONGINT; BEGIN FOR i:=1 TO st0 DO BEGIN IF x1[i] = x2[i] THEN BEGIN xx3(x1[i], y1[i], y2[i], num[i], i); CONTINUE; END; IF x1[i] + 1 = x2[i] THEN BEGIN xx3(x1[i], y1[i], m, num[i], i); xx3(x2[i], 1, y2[i], num[i], i); CONTINUE; END; IF x1[i] + 2 = x2[i] THEN BEGIN xx3(x1[i], y1[i], m, num[i], i); xx3(x1[i] + 1, 1, m, num[i], i); xx3(x2[i], 1, y2[i], num[i], i); CONTINUE; END; IF x1[i] + 3 = x2[i] THEN BEGIN xx3(x1[i], y1[i], m, num[i], i); xx3(x1[i] + 1, 1, m, num[i], i); xx3(x1[i] + 2, 1, m, num[i], i); xx3(x2[i], 1, y2[i], num[i], i); CONTINUE; END; xx3(x1[i], y1[i], m, num[i], i); xx3(x1[i] + 1, 1, m, num[i], i); add(0, (x2[i] - x1[i] - 3) * m); xx3(x2[i] - 1, 1, m, num[i], i); xx3(x2[i], 1, y2[i], num[i], i); END; END; PROCEDURE pri; VAR i: LONGINT; BEGIN WRITELN(m); FOR i:=1 TO sr0 DO WRITELN(rn[i], ' ', rkk[i]); WRITELN(0, ' ', 0); END; BEGIN REPEAT init; xxx; pri; UNTIL FALSE; END. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator