|
|
back to boardGive me some tests please I have WA#16, give me some tests please Edited by author 09.11.2014 18:38 No subject Edited by author 09.11.2014 18:35 Edited by author 09.11.2014 18:35 Re: No subject 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 Posted by d_m 2 Jun 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 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! |
|
|