Другие языки программирования и технологии
Как решать такую задачу?
Поле шахматной доски определяется парой натуральных чисел: первое число - номер вертикали, второе - номер горизонтали (вертикали нумеруются слева направо, горизонтали - снизу вверх). Шахматная доска имеет размер 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.
… Может и не оптимально, но зато наглядно!
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.
… Может и не оптимально, но зато наглядно!
Проверить все возможные ходы коня из данной клетки. Если один из ходов приводит в нужную нам, то все хорошо иначе повторяем проверку для каждой клетки в которую конь может попасть в рез-те первого хода.
Если самой делать лень - стучись в асю 6два958178восемь обсудим.
Если самой делать лень - стучись в асю 6два958178восемь обсудим.
Основная формула такая |i-k|+|j-l|=3
(|a-b| разница взятая по модулю)
(|a-b| разница взятая по модулю)
Похожие вопросы
- Знаю хорошо язык программирования на 70% то что необходимо на начальном этапе. Но не могу решать некоторые задачи.
- Программисит должен уметь решать поставленные задачи, но на что это похоже?
- Умею решать математические задачи, а на языке программирование вообще ни капли даже в голову не приходит как?
- Посоветуйте сайт для решения сложных задач по программированию, тоесть хочу научится решать сложные задачи, что читать?
- Почему для программиста который решает прикладные задачи нужна физика?
- Можно ли с помощью программирования решать политические задачи?
- Для чего в колледже решает математические задачи на Pascal, C \ C ++ и. т. п ..
- Как развить многозадачность, способность решать несколько задач в голове одновременно
- Как вы решаете задачи?
- Как научиться решать задачи по программированию?