Boolean37. Даны координаты двух различных полей шахматной доски $$x_1$$, $$y_1$$, $$x_2$$, $$y_2$$ (целые числа, лежащие в диапазоне 1–8). Проверить истинность высказывания: «Король за один ход может перейти с одного поля на другое».
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
program Boolean37; var x1,y1,x2,y2: Integer; begin Write('Введите 1 координату 1 клетки шахматной доски: '); Readln(x1); Write('Введите 2 координату 1 клетки шахматной доски: '); Readln(y1); Write('Введите 1 координату 2 клетки шахматной доски: '); Readln(x2); Write('Введите 2 координату 2 клетки шахматной доски: '); Readln(y2); //Writeln((abs(abs(x1-x2)-abs(y1-y2))<=1) and ((abs(x1-x2)+abs(y1-y2))<>0)); Writeln((abs(x1-x2)<=1) and (abs(y1-y2)<=1)); readln; end. |
Другие задачи из раздела Boolean можно посмотреть здесь.
Должно быть ‘and’ вместо ‘or’.
Почему?
король ходит так:
000
010
000
1 король, 0 куда может пойти.
Тоесть должно исполниться одно из условий:
(abs(x1-x2)<=1) (клетка по х поменялась на 1) или (abs(y1-y2)<=1). (клетка по y поменялась на 1). если поставить and должны будут исполнится два условия, а это изменение клетки по диагонали. Что то типо того получиться: 0х0 х1х 0х0
Хорошо. Позиция короля — 4.2. Если ввести 8.2, например, то вывод будет true, хотя так король ходить не может
король ведь по диагонали ходит
а, ты имеешь в виду, что одновременно не может по диагонали и в стороны…
Угу. Что если просто поставить and то будут только диагонали…
пришлось существенно усложнить строчку….
было
Стало:
Всё верно, король может ходить сразу по диагонали, поэтому and
да, но в ситуации
Writeln((abs(x1-x2)<=1) and (abs(y1-y2)<=1)) когда года он будет идти в сторону то будет ложь... а это не правильно... например ход (1.1) ->(1.2)
почему?
abs(1-1)<=1 — условие выполняется (т.к. будет 0, а он меньше 1)
abs(1-2)<=1 — условие тоже выполняется
Да ты прав… ещё раз поправил… 🙂 на сегодня интеллектуальной деятельности хватит… спать… спать… спать… 🙂
у меня просто с and в задачнике прокатило, раз 40 понажимал проверку