Другие языки программирования и технологии

Как решать такую задачу?

Поле шахматной доски определяется парой натуральных чисел: первое число - номер вертикали, второе - номер горизонтали (вертикали нумеруются слева направо, горизонтали - снизу вверх). Шахматная доска имеет размер 8х8. Даны натуральные числа i, j, k, l. Определить, можно ли с поля (i,j) одним ходом коня попасть на поле (k,l). Если нет, то выяснить, можно ли это сделать за два хода, если можно, то указать поле, на которое приводит первый ход (конь ходит буквой Г)
Вот полная программа:
var
i, j, k, l: Integer;

procedure OneStep(N, i, j : Integer; var i1, j1 : Integer);
begin
case N of
1 : begin i1 := i + 2; j1 := j + 1; end;
2 : begin i1 := i + 2; j1 := j - 1; end;
3 : begin i1 := i + 1; j1 := j - 2; end;
4 : begin i1 := i - 1; j1 := j - 2; end;
5 : begin i1 := i - 2; j1 := j + 1; end;
6 : begin i1 := i - 2; j1 := j - 1; end;
7 : begin i1 := i + 1; j1 := j + 2; end;
8 : begin i1 := i - 1; j1 := j + 2; end;
end;
end;

procedure FindTwoSteps(i, j : Integer);
var
N1, N2, i1, i2, j1, j2 : Integer;
B : Boolean;
begin
N1 := 0;
repeat
Inc(N1); N2 := 0;
OneStep(N1, i, j, i1, j1);
if (i1 in [1..8]) and (j1 in [1..8]) then
repeat
Inc(N2);
OneStep(N2, i1, j1, i2, j2);
B := ((i2 = k) and (j2 = l) and (i2 in [1..8]) and (j2 in [1..8]));
until (N2 = 8) or B;
until (N1 = 8) or B;
if B then WriteLn('Можно за 2 хода. Первый ход: ', i1, ',', j1)
else WriteLn('Нельзя. ');
end;

procedure FindOneStep(i, j : Integer);
var
N, i1, j1 : Integer;
B : Boolean;
begin
N := 0;
repeat
Inc(N);
OneStep(N, i, j, i1, j1);
B := ((i1 = k) and (j1 = l) and (i1 in [1..8]) and (j1 in [1..8]));
until (N = 8) or B;
if B then WriteLn('Можно за 1 ход. ') else FindTwoSteps(i, j);
end;

begin
Write('i = '); ReadLn(i);
Write('j = '); ReadLn(j);
Write('k = '); ReadLn(k);
Write('l = '); ReadLn(l);

FindOneStep(i, j);
end.

… Может и не оптимально, но зато наглядно!
Александр Глуховцов
Александр Глуховцов
80 014
Лучший ответ
Проверить все возможные ходы коня из данной клетки. Если один из ходов приводит в нужную нам, то все хорошо иначе повторяем проверку для каждой клетки в которую конь может попасть в рез-те первого хода.
Если самой делать лень - стучись в асю 6два958178восемь обсудим.
Ermek Rispanov
Ermek Rispanov
7 069
Основная формула такая |i-k|+|j-l|=3
(|a-b| разница взятая по модулю)