Задача 4: Обучение шахматам Маленькая Ева только учится играть в шахматы. Сегодня она узнала, как слон ходит по шахматной доске. Теперь она хочет понять, куда слон может добраться не более чем за 100 ходов Еве понять, может ли слон добраться от одной клетки до другой клетки шахматной доски.
Шахматный слон за один ход перемещается по диагонали на любое количество клеток. Шахматная доска имеет размеры 8 × 8.
Входные данные
Программа получает на вход 4 числа, записанных в отдельных строках. Первые два числа — номер строки и номер столбца исходной клетки, следующие два числа — номер строки и номер столбца конечной клетки (каждое число принимает значения от 1 до 8). Гарантируется, что исходная и конечная клетки не совпадают.
Выходные данные
В первой строке выведите Yes или No — ответ на вопрос задачи. Если в первой строке вы вывели Yes, то во второй строке выведите число n — количество ходов слона (число не превосходящее 100). В следующих n строках выведите последовательно клетки (номер строки и номер столбца клетки через пробел), в которые нужно перемещать слона. Последняя выведенная клетка должна совпадать с заданной конечной клеткой.
Вам не нужно минимизировать число ходов слона, но оно не должно превосходить 100.
Система оценки
В этой задаче 20 тестов, помимо тестов из условия. Каждый тест оценивается в независимо от остальных.
const
k = 100;
type
maze = array [1..k, 1..k] of integer;
var
l : maze;
n, m: integer;
i, j: integer;
c: char;
t: text;
w: integer;
x0, y0: integer;
x1, y1: integer;
procedure ways(a,b,r:integer);
begin
if (w = 0) or (r < w) then {нет смысла идти дальше, если текущий путь уже превосходит найденный}
if (l[a,b] <> -2) then
if (r < l[a,b]) or (l[a,b] = -1) then {нет смысла идти, если текущая клетка уже была достигнута за меньшее число шагов}
begin
l[a,b] := r;
if (a = x1) and (b = y1) then
w := r
else
begin
if a <> 1 then ways(a - 1, b, r + 1);
if b <> 1 then ways(a, b - 1, r + 1);
if a <> n then ways(a + 1, b, r + 1);
if b <> m then ways(a, b + 1, r + 1);
end
end;
end;
begin
assign(t, 'input.txt');
reset(t);
w := 0;
readln(t, n, m);
readln(t, x0, y0);
readln(t, x1, y1);
for i := 1 to n do
begin
for j := 1 to m do
begin
read(t, c);
case c of
'.' : l[i,j] := -1; {будем считать, что если клетка отмечена как -1, то путь к ней еще не найден}
'X' : l[i,j] := -2; {-2, если клетка непроходима}
end;
end;
readln(t)
end;
close(t);
if (l[x0,y0] <> -2) and (l[x1,y1] <> -2) then
begin
l[x0,y0] := 1; {просто трюк, чтобы пройти проверку на (r < l[x0,y0])}
ways(x0, y0, 0);
end
else
l[x1,y1] := -1;
writeln(l[x1,y1])
end.
i,k,N : Integer;
Begin
For i:=0 to 6 do m[i]:=0;
Readln(N);
k:=6;
While N>0 do
Begin
If N>=Power(2,k) then
Begin
N:=N-Trunc(Power(2,k));
Inc(m[k]);
end else Dec(k);
end;
For i:=0 to 6 do Writeln(Power(2,i),' ',m[i],' шт.');
end.
Еще вариант:
Const
NN = 7;
money : array[1..7] of Integer = (1,2,4,8,16,32,64);
Var m : array[1..NN] of Integer;
i,k,N : Integer;
Begin
For i:=1 to NN do m[i]:=0;
Readln(N);
k:=NN;
While N>0 do
Begin
If N>=money[k] then
Begin
N:=N-money[k];
Inc(m[k]);
end else Dec(k);
end;
For i:=1 to NN do Writeln(money[i],' ',m[i],' шт.');
end.