ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1101. Робот в поле

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?
Послано I have answers to all your questions :) 23 ноя 2001 16:27
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?
Послано I have answers to all your questions :) 23 ноя 2001 18:26
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
Послано I have answers to all your questions :) 24 ноя 2001 17:12
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;