http://acm.pku.edu.cn/JudgeOnline/problem?id=1184
Код:
program PKU1184; const maxn = 6; maxm = 1 * 2 * 3 * 4 * 5 * 6 * 7; none = 10000000; type integer = longint; node = array[0 .. 7] of integer; var f: array[0 .. maxm - 1, 0..63] of integer; q: array[1 .. maxm * 64] of node; s, b, bit, data: node; ans, open, closed: integer; function min(i, j: integer): integer; begin if i < j then min := i else min := j; end; function num(var c: node): integer; var i, j, tmp: integer; begin tmp := 0; for i := 1 to 5 do for j := i + 1 to 6 do if c[j] < c[i] then tmp := tmp + data[c[i]]; num := tmp + c[0] * data[7]; end; function calc(var c: node): integer; var i, tmp: integer; begin tmp := 0; for i := 1 to 6 do if (s[c[i]] <> b[i]) and (c[7] and bit[c[i]] = 0) then exit(none) else tmp := tmp + abs(s[c[i]] - b[i]); calc := tmp; end; procedure prepare; var i: integer; ch: char; begin for i := 1 to 6 do bit[i] := 1 shl (i - 1); data[2] := 1; for i := 3 to 7 do data[i] := data[i - 1] * (i - 1); for i := 1 to 6 do begin read(ch); s[i] := ord(ch) - ord('0'); end; read(ch); for i := 1 to 6 do begin read(ch); b[i] := ord(ch) - ord('0'); end; end; procedure push(var c: node; dep: integer); var k: integer; begin k := num(c); c[7] := c[7] or bit[c[c[0]]]; if f[k, c[7]] = 0 then begin f[k, c[7]] := dep; ans := min(ans, calc(c) + f[k, c[7]]); closed := closed + 1; q[closed] := c; end; end; var temp: integer; procedure swap(var i, j: integer); begin temp := i; i := j; j := temp; end; procedure main; var t: integer; a, c: node; begin fillchar(f, sizeof(f), 0); open := 0; closed := 1; for t := 1 to 6 do a[t] := t; a[0] := 1; a[7] := 1; q[1] := a; t := num(a); f[t, 1] := 1; ans := calc(a) + 1; while open < closed do begin open := open + 1; a := q[open]; t := num(a); if a[0] < 6 then begin c := a; c[0] := a[0] + 1; push(c, f[t, a[7]] + 1); end; if a[0] > 1 then begin c := a; c[0] := a[0] - 1; push(c, f[t, a[7]] + 1); end; c := a; swap(c[c[0]], c[1]); push(c, f[t, a[7]] + 1); c := a; swap(c[c[0]], c[6]); push(c, f[t, a[7]] + 1); end; writeln(ans - 1); end; begin prepare; main; end.