Помощь - Поиск - Пользователи - Календарь
Полная версия: шахматы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Виликан
Поле шахматной доски определяется парой натуральных чи-сел, каждое из которых не превосходит восьми: первое число – номер вертикали (при счете слева направо), второе – номер горизонтали (при счете снизу вверх). Даны натуральные числа k, l, m, n, каждое из которых не превосходит восьми. Требуется:
a) Выяснить, являются ли поля (k, l) и (m, n) полями одного цвета;
b) На поле (k, l) расположен ферзь. Угрожает ли он полю (m, n)?
c) Аналогично b), но ферзь заменяется на коня.
d) Выяснить, можно ли с поля (k, l) одним ходом ладьи попасть на поле (m, n). Если нет, то выяснить, как это можно сделать за два хода (указать поле, на которое приводит первый ход).
e) Аналогично d), но ладья заменяется на ферзя.
f) Аналогично d), но ладья заменяется на слона.
Предполагается, что указанные поля имеют один и тот же цвет.

попрошу всю задачу не решать, а только помогать по мере поступления вопросов... извините, если что не так, я тут новенький unsure.gif !

 
Program Z165;
uses crt;
var k, l, m, n:integer;
Begin
clrscr;
writeln ('Vvedite znachenie pervogo polja');
readln (k, l);
writeln ( 'Vvedite znachenie vtorogo polja');
readln (n, m);
begin
if (k mod 2=0 and l mod 2=0 and m mod 2=0 and n mod 2=0 or k mod 2=1 and l mod 2=1 and m mod 2=1 and n mod 2=1) then

writeln ( 'a) polja odnogo cveta')
else
writeln ( 'a) polja raznogo cveta');
end;
readkey;

End.
.
паскаль выдает ошибку №89 в поле с if хотя скобки вроде две)) что не так?
если есть другой способ решения пункта а интересно послушать! rolleyes.gif
vlads
Цитата
хотя скобки вроде две)) что не так?
Вот то, что их только 2 и не так. Каждое условие оберни скобками - будет компилироваться.

if (k mod 2=0) and (l mod 2=0) and (m mod 2=0) and (n mod 2=0) or
(k mod 2=1) and (l mod 2=1) and (m mod 2=1) and (n mod 2=1) then
Иначе компилятор неправильно разберет выражение. Попробуй самостоятельно расставить в выражении
if (k mod 2 = 0 and l mod 2 = 0) then скобки согласно приоритетам операций - увидишь в чем ошибка.

Кстати, именно из-за того,что приоритет у and выше чем у or, нет необходимости оборачивать скобками еще и оба условия с разных сторон от or
sheka
Прочитай, пожалуйста, про приоритет операций - сразу же поймешь.
Цитата
другой способ решения пункта а

if (k+l+m+n)mod 2 =0 then
-TarasBer-
Если пытаться приделать логичность, то тогда так:

if odd(k xor l) = odd(m xor n) then...

А сумма может сделать плохо, если координаты заданы типом-диапазоном.
Виликан
Всем большое спасибо... все советы полезны cool.gif
Виликан

begin
if (k=m) or (l=n) or (k+l=m+n) then
writeln ('b) ferz` ygrogaet!')
else
writeln ('b) ferz` ne ygrogaet, rasslabtes`')
end;
begin
if (k=m+-1) and (l=n+-2)or (k=m+-2) and (l=n+-1)then
writeln ('c) kon` ygrogaet!')
else
writeln( 'c) kon` ne ygrogaet, rasslabtes`')
end;


Вот так я расправился с b, а вот насчет с вопрос:" Можно ли писать +- и если да, то почему не работает?"
Помогите кто чем может yes2.gif
Lapp
Цитата(Виликан @ 22.04.2011 0:34) *

begin
if (k=m) or (l=n) or (k+l=m+n) then
writeln ('b) ferz` ygrogaet!')
else
writeln ('b) ferz` ne ygrogaet, rasslabtes`')
end;
begin
if (k=m+-1) and (l=n+-2)or (k=m+-2) and (l=n+-1)then
writeln ('c) kon` ygrogaet!')
else
writeln( 'c) kon` ne ygrogaet, rasslabtes`')
end;


Вот так я расправился с b, а вот насчет с вопрос:" Можно ли писать +- и если да, то почему не работает?"
Помогите кто чем может yes2.gif

В "b" нужно добавить еще проверку равнства разностей.

Нет, писать "+-" нельзя. Можешь использовать конструкцию с модулем:
if Abs(k-m)=1 then ..


исправил описку
TarasBer
> if (k=m+-1) and (l=n+-2)or (k=m+-2) and (l=n+-1)then

if sqr(k-m) + sqr(l-n) = 5 then
Lapp
Цитата(TarasBer @ 22.04.2011 9:57) *

if sqr(k-m) + sqr(l-n) = 5 then

Это хорошо тем, что имеет ясную графическую интерпретацию: цетры битых полей лежат на окружности с радиусом Sqrt(5). Достаточно посмотреть на доску, чтоб в этом убедиться.

Но вот интересно, что эта мысль приходит после выписывания уравнения, а не при первом взгляде на доску.. ))
Polinka
попробуй так (((k mod 2=0) and (l mod 2=0) and (m mod 2=0) and (n mod 2=0)) or ((k mod 2=1) and (l mod 2=1) and (m mod 2=1) and (n mod 2=1)))
TarasBer
Неправильно.
Не работает для
k=1
l=2
m=2
n=1
Гость
mega_chok.gif mega_chok.gif mega_chok.gif как в этом можно что то понять blink.gif unsure.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.