What's wrong with my code here? Послано Li, Yi 23 ноя 2001 09:47 const dir : array[1..4, 1..2]of shortint = ((1, 0), (-1, 0), (0, 1), (0, -1)); left : array[1..4]of byte = (3, 4, 2, 1); right : array[1..4]of byte = (4, 3, 1, 2); var a : array[-101..101, -101..101]of byte; v : array['A'..'Z']of boolean; i, n, m, k, d : integer; x, y : shortint; exp : string; ch : char; ans : boolean; function leftbracket(i : integer) : integer; var j : integer; begin j := 0; repeat if exp[i] = '(' then inc(j); if exp[i] = ')' then dec(j); dec(i); until j = 0; leftbracket := i + 1; end; function getopr(a, b : integer) : integer; var i, j, k : integer; begin i := b; j := 0; while i >= a do begin if exp[i] = '|' then begin getopr := i; exit; end; if exp[i] = '&' then if j < 2 then begin k := i; j := 2; end; if exp[i] = '!' then if j < 4 then begin k := i; j := 3; end; if exp[i] = ')' then i := leftbracket(i); dec(i); end; getopr := k; end; function eval(a, b : integer) : boolean; var i : integer; l, r : boolean; begin if a = b then begin if exp[a] = 't' then eval := true else if exp[a] = 'f' then eval := false else eval := v[exp[a]]; exit; end; if (exp[a] = '(') and (exp[b] = ')') and (leftbracket(b) = a) then begin eval := eval(a + 1, b - 1); exit; end; i := getopr(a, b); if exp[i] = '|' then begin l := eval(a, i - 1); r := eval(i + 1, b); eval := l or r; end else if exp[i] = '&' then begin l := eval(a, i - 1); r := eval(i + 1, b); eval := l and r; end else begin l := eval(i + 1, b); eval := not l; end; end; procedure convert; var i : integer; begin i := pos('OR', exp); while i > 0 do begin delete(exp, i, 2); insert('|', exp, i); i := pos('OR', exp); end; i := pos('AND', exp); while i > 0 do begin delete(exp, i, 3); insert('&', exp, i); i := pos('AND', exp); end; i := pos('NOT', exp); while i > 0 do begin delete(exp, i, 3); insert('!', exp, i); i := pos('NOT', exp); end; i := pos('TRUE', exp); while i > 0 do begin delete(exp, i, 4); insert('t', exp, i); i := pos('TRUE', exp); end; i := pos('FALSE', exp); while i > 0 do begin delete(exp, i, 5); insert('f', exp, i); i := pos('FALSE', exp); end; i := pos(' ', exp); while i > 0 do begin delete(exp, i, 1); i := pos(' ', exp); end; end; begin assign(input, '1101.in'); reset(input); readln(exp); convert; readln(n, m, k); for i := 1 to m do begin readln(x, y); a[x, y] := 1; end; for i := 1 to k do begin read(x, y); read(ch); while not (ch in ['A'..'Z']) do read(ch); a[x, y] := ord(ch); end; close(input); fillchar(v, sizeof(v), 0); x := 0; y := 0; d := 1; repeat writeln(x, ' ', y); x := x + dir[d, 1]; y := y + dir[d, 2]; if a[x, y] = 1 then begin ans := eval(1, length(exp)); if ans then d := right[d] else d := left[d]; end else if a[x, y] > 60 then v[chr(a[x, y])] := not v[chr(a[x, y])]; until (abs(x) > n) or (abs(y) > n); end. Re: What's wrong with my code here? there's a bug in getopr function What is the bug? Послано Li, Yi 23 ноя 2001 16:47 > there's a bug in getopr function Re: What is the bug? change 4 numbers in getopr function and u'll get accepted ;) HINT : if exp = 'NOT FALSE AND FALSE' ur program evaluate it this way : NOT (FALSE AND FALSE) I modified my code and WA again. Послано Li, Yi 24 ноя 2001 15:54 Please say how to fix the bug clearly. modified getopr function function getopr(a, b : integer) : integer; var i, j, k : integer; begin i := b; j := 0; while i >= a do begin if exp[i] = '|' then begin getopr := i; exit; end; if exp[i] = '&' then if j < 4 then begin k := i; j := 3; end; if exp[i] = '!' then if j < 2 then begin k := i; j := 2; end; if exp[i] = ')' then i := leftbracket(i); dec(i); end; getopr := k; end; I modified it just as this! I forgot remove file operation lines, so WA. Thank you Послано Li, Yi 24 ноя 2001 17:18 > function getopr(a, b : integer) : integer; > var i, j, k : integer; > begin > i := b; > j := 0; > while i >= a do > begin > if exp[i] = '|' then begin getopr := i; exit; end; > if exp[i] = '&' then > if j < 4 then > begin k := i; j := 3; end; > if exp[i] = '!' then > if j < 2 then > begin k := i; j := 2; end; > if exp[i] = ')' then i := leftbracket(i); > dec(i); > end; > getopr := k; > end; |