Во вложении показана принятая условная схема нумерации полей. Предполагается, что если ферзь стоит на клетке с координатами (3,4), он может пойти по горизонтали, вертикали или диагонали. Соответствующие направления выделены цветом. Чтобы взять фигуру (или пешку) противника по горизонтали, у обоих фигур должны быть одинаковы координаты строки (первые в паре). Чтобы взять фигуру противника по вертикали, у обоих фигур должны быть одинаковы координаты столбца (вторые в паре в паре). Наконец, чтобы взять фигуру противника по диагонали, у обоих фигур должна быть одинакова абсолютная величина разницы как между строками, так и между колонками. Последнее правило взятия сложное, поэтому запишем его в условных обозначениях. Пусть Rq и Cq - соответственно номера строки и столбца, пересечение которых указывает положение клетки с ферзем. Пусть также фигура противника находится на клетке, заданной координатами Rx и Cx. Тогда последнее правило можно записать в виде |Rq-Rx| = |Cq-Cx| Теперь можно записать логическое выражение, значение которого истинно, если ферзь может взять фигуру (или пешку) противника. (Rq=Rx) ∨ (Cq=Cx) ∨ (|Rq-Rx| = |Cq-Cx|)
// PascalABC.NET 3.3, сборка 1625 от 17.01.2018 // Внимание! Если программа не работает, обновите версию!
begin var (Rq,Cq):=ReadInteger2('Введите номера горизонтали и вертикали ферзя:'); var (Rx,Cx):=ReadInteger2('Введите номера горизонтали и вертикали фигуры:'); if (Rq=Rx) or (Cq=Cx) or (Abs(Rq-Rx)=Abs(Cq-Cx)) then Writeln('Yes') else Writeln('No') end.
Пример Введите номера горизонтали и вертикали ферзя: 3 4 Введите номера горизонтали и вертикали фигуры: 6 1 Yes
1+2+3+... - это арифметическая прогрессия с разностью d, равной единице и первым членом a₁=1. Сумма n первых членов арифметической прогрессии может быть найдена по формуле S=(2a₁+d(n-1))*n/2. В нашем случае формула упрощается: S = (2+1(n-1))n/2 = n(n+1)/2 По условию члены прогрессии суммируются, пока сумма не превысит 1000. Тогда 0.5n(n+1)>1000 n(n+1)>2000; n²+n-2000>0 Найдем минимальное n, удовлетворяющее этому условию. n²+n+2000=0; D=1+8000=8001; √D ≈ 89.4 n₁=0.5(-1-89.4) < 0 - не устраивает, поскольку n>1 n₂=0.5(-1+89.4) =44.2 Принимаем n=45. Сумма составит 45(45+1)/2=1035, а последний член равен n, т.е .45
Непонятно, зачем нам составлять программу. Пусть для того, чтобы проверить наше решение, поэтому выберем другой алгоритм. Будем последовательно наращивать сумму 1+2+3+4 до превышения ей значения 1000. Решение, что называется, "в лоб".
2. Блок-схема приведена во вложении.
3. Программа
// PascalABC.NET 3.3, сборка 1625 от 17.01.2018 // Внимание! Если программа не работает, обновите версию!
begin var (s,i):=(0,1); while true do begin s+=i; if s>1000 then begin Writeln('S=',s,', последний член ',i); exit end; i+=1 end end.
Предполагается, что если ферзь стоит на клетке с координатами (3,4), он может пойти по горизонтали, вертикали или диагонали. Соответствующие направления выделены цветом.
Чтобы взять фигуру (или пешку) противника по горизонтали, у обоих фигур должны быть одинаковы координаты строки (первые в паре).
Чтобы взять фигуру противника по вертикали, у обоих фигур должны быть одинаковы координаты столбца (вторые в паре в паре).
Наконец, чтобы взять фигуру противника по диагонали, у обоих фигур должна быть одинакова абсолютная величина разницы как между строками, так и между колонками.
Последнее правило взятия сложное, поэтому запишем его в условных обозначениях. Пусть Rq и Cq - соответственно номера строки и столбца, пересечение которых указывает положение клетки с ферзем. Пусть также фигура противника находится на клетке, заданной координатами Rx и Cx.
Тогда последнее правило можно записать в виде |Rq-Rx| = |Cq-Cx|
Теперь можно записать логическое выражение, значение которого истинно, если ферзь может взять фигуру (или пешку) противника.
(Rq=Rx) ∨ (Cq=Cx) ∨ (|Rq-Rx| = |Cq-Cx|)
// PascalABC.NET 3.3, сборка 1625 от 17.01.2018
// Внимание! Если программа не работает, обновите версию!
begin
var (Rq,Cq):=ReadInteger2('Введите номера горизонтали и вертикали ферзя:');
var (Rx,Cx):=ReadInteger2('Введите номера горизонтали и вертикали фигуры:');
if (Rq=Rx) or (Cq=Cx) or (Abs(Rq-Rx)=Abs(Cq-Cx)) then Writeln('Yes')
else Writeln('No')
end.
Пример
Введите номера горизонтали и вертикали ферзя: 3 4
Введите номера горизонтали и вертикали фигуры: 6 1
Yes