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

Обсуждение задачи 2010. Юный гроссмейстер Саша

Give me some tests please
Послано Ivan Metelev UFU SESC 28 окт 2014 07:14
I have WA#16, give me some tests please

Edited by author 09.11.2014 18:38
No subject
Послано Ivan Metelev 9 ноя 2014 17:56

Edited by author 09.11.2014 18:35

Edited by author 09.11.2014 18:35
Re: No subject
Послано Ivan Metelev 1 июн 2016 11:12
I can poste my bad code, can someone help me?

var
  a, b, n, x, y: int64;

begin
  readln(n, x, y);
  write('King: ');
  if n = 1 then writeln(0) else
  if ((x = 1) and (y = 1)) or ((x = n) and (y = 1)) or ((x = 1) and (y = n)) or ((x = n) and (y = n)) then writeln(3) else
  if (x = 1) or (y = 1) or (x = n) or (y = n) then writeln(5) else writeln(8);
  write('Knight: ');
  if (n = 1) or (n = 2) or ((n = 3) and (x = 2) and (y = 2)) then writeln(0) else
  if (((y = 1) and (x = 1)) or ((y = n) and (x = n)) or ((y = 1) and (x = n)) or ((y = n) and (x = 1))) or (n = 3) and ((x = 2) or (y = 2)) then writeln(2) else
  if ((x = 2) and ((y = 1) or (y = n))) or ((x = n - 1) and ((y = 1) or (y = n)) or ((y = 2) and ((x = 1) or (x = n))) or ((Y = N - 1) and ((x = 1) or (x = n))))  then writeln(3) else
  if (((x >= 3) and (x <= n - 2)) and ((y = 1) or (y = n))) or (((y >= 3) and (y <= n - 2)) and ((x = 1) or (x = n))) or ((x = 2) and ((y = 2) or (y = n - 1)) or ((x = n - 1) and ((y = 2) or (y = n - 1)))) then  writeln(4)  else
  if (((x >= 3) and (x <= n - 2)) and ((y = 2) or (y = n - 1))) or (((y >= 3) and (y <= n - 2)) and ((x = 1) or (x = n)))  then writeln(6) else writeln(8);

  if n = 1 then a := 0 else
  if (n - x >= x) and (n - x >= n - y) and (n - x >= y) then a := (n - 1) + 2 * (x - 1) else
  if (x >= n - x) and (x >= n - y)   and (x >= y)   then a := (n - 1) + 2 * (n - x) else
  if (y >= x)   and (y >= n - y)   and (y >= n - x) then a := (n - 1) + 2 * (n - y) else
  if (n - y >= x) and (n - y >= n - x) and (n - y >= y) then a := (n - 1) + 2 * (y - 1);
  if n = 1 then b := 0 else b := (n - 1) * 2;
  writeln('Bishop: ', a);
  writeln('Rook: ', b);
  writeln('Queen: ', a + b);
end.

Edited by author 01.06.2016 11:32
Re: No subject
Послано d_m 2 июн 2016 14:44
I don't know where is problem in your code. But you can insert in the beginning something like that:

if x > (n + 1) div 2 then x := n + 1 - x;
if y > (n + 1) div 2 then y := n + 1 - y;

and remove all comparisons with n. It will make your code much simpler.
Re: No subject
Послано Jane Soboleva (SumNU) 2 июн 2016 17:15
A much more simple approach would be creating something like
function InBounds(x0, y0, xshift, yshift: longint): boolean;
begin
    inc(x0, xshift); inc(y0, yshift);
    InBounds:=((x0 >= 1) and (x0 <= N) and (y0 >= 1) and (y0 <= N));
end;
This will allow to check king and knight in a much more simple and elegant way.
King:
res:=-1;
for i:=-1 to 1 do
    for j:=-1 to 1 do
        if InBounds(x0, y0, i, j) then inc(res);
writeln('King: ', res);
Knight:
res:=0;
for i:=1 to 2 do //length before turn
    for j:=0 to 1 do //sign 1
        for k:=0 to 1 do begin //sign 2
            if InBounds(x0, y0, (j + j - 1) * i, (k + k - 1) * (3 - i)) then inc(res);
        end;
writeln('Knight: ', res);

For rook, it's always N + N - 2, even for N = 1, so there was no need to specifically bring up that case...
Queen is rook + bishop, and bishop i'd say is the "hardest" part here, but well, you just take the minimum of squares he can move to in each 4 directions, just be attentive...
Good luck!