М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
ekaterinaf79
ekaterinaf79
19.07.2020 04:31 •  Информатика

На шахматной доске размером 8 на 8 в клетке s находится король. Определите, за какое минимальное количество ходов король может перейти в клетку f. По правилам игры в шахматы король может переместиться на любое поле, соседнее с текущим по вертикали, горизонтали или вертикали. Возможность рокировки в данной задаче не предусмотрена.
ответ сделать на языке Pascal

👇
Ответ:
суперкот78
суперкот78
19.07.2020
Наши действия

Для того, чтобы решить задачу, нам не требуется делать какие-то сложные переборы в поисках кратчайшего пути. Так как на поле у нас нет никаких препятствий, нам достаточно рассчитать расстояние между клетками поля. Это и будет ответом.

Как рассчитать расстояние

Для этого используются метрики.

Мне тут давеча сказали, что это слово пугает детей и вводит их в паническое состояние.

¯\_(ツ)_/¯  Не понимаю, чего там такого пугающего)

На самом деле, тут всё просто, так что забудем про страшные слова и посмотрим, как можно вычислять расстояния.

Для примера возьмём плоскость, на которой нам достаточно 2-х координат для задания положения точек.

Как посчитать расстояние между точкой А(x0, y0) и B(x1, y1)?

Уроки геометрии учат, что L = \sqrt{(x_1 - x_0)^2 + (y_1 - y_0)^2}. Поздравляю, ты познакомился со своей первой метрикой. Она называется Евклидова метрика. Или Евклидово расстояние - кратчайшее расстояние между двумя точками пространства.

А теперь представим, что ты оказался в центре города. И тебе надо узнать, как много нужно пройти от твоего местоположения до гостиницы. Путь это будут всё те же точки A и B.

Мы уже могли бы рассчитать Евклидову метрику. Однако она нам мало чем мы ведь не можем ходить насквозь домов. Придётся обходить. А значит, и расстояние увеличится.

Для такой ситуации подходит Манхэттенская метрика или по-другому Расстояние городских кварталов.

Рассчитывается она тоже просто L = |x_1 - x_0| + |y_1 - y_0|. То есть просто сумма расстояний по x и по y. Если ходить по улицам, не через дворы, то нам не важно, сколько раз мы будем поворачивать. Мы пройдем столько же, сколько бы сначала по x, а потом по y.

Помимо этих двух метрик, есть ещё метрика Чебышёва.

Она рассчитывается как L = \max(|x_1 - x_0| , |y_1 - y_0|). То есть вычисляются расстояния по координатам, и выбирается максимальное из них.

Забавно, но одно из объяснений этой метрики звучит как "Минимальное количество ходов, которое требуется совершить королю из клетки A в клетку B".

Ниже я привел картинку, на которой можно увидеть, почему это работает.

Итак, решено. Будем рассчитывать искомое расстояние по методу Чебышёва.

КодProgram king;Varx0, y0, x1, y1: integer;BeginWriteln('Введите координаты точки s:');Readln(x0, y0);Writeln('Введите координаты точки f:');Readln(x1, y1);If ((a < 1) or (a > 8) or (b < 1) or (b > 8) or (c < 1) or (c > 8) or (d < 1) or (d > 8)) thenWriteln('Ошибка! Проверьте правильность введённых данных! Закрытие программы... ')ElseWriteLn(Max(Abs(x1 - x0), Abs(y1 - y0)));Readln;End.
4,6(62 оценок)
Ответ:
ruslanamotul1510
ruslanamotul1510
19.07.2020

program shkisvf;

uses

crt;

procedure minh(sx, sy, dx, dy: integer);

var

h: integer;

begin

h := 0;

while ((sx <> dx) and (sy <> dy)) do

begin

if (sx < dx) and (sy < dy) then

begin

sx := sx + 1;

sy := sy + 1;

h := h + 1;

end ;

if (sx > dx) and (sy < dy) then

begin

sx := sx - 1;

sy := sy + 1;

h := h + 1;

end ;

if (sx < dx) and (sy > dy) then

begin

sx := sx + 1;

sy := sy - 1;

h := h + 1;

end ;

if (sx > dx) and (sy > dy) then

begin

sx := sx - 1;

sy := sy - 1;

h := h + 1;

end ;

end;

while ((sx <> dx) or (sy <> dy)) do

begin

if sx < dx then

begin

sx := sx + 1;

h := h + 1;

end ;

if sx > dx then

begin

sx := sx - 1;

h := h + 1;

end ;

if sy < dy then

begin

sy := sy + 1;

h := h + 1;

end ;

if sy > dy then

begin

sy := sy - 1;

h := h + 1;

end ;

end;

writeln('Минимальное количество ходов: ', h);

end;

procedure cheb(sx, sy, dx, dy: integer);

var

max, rx, ry: integer;

begin

rx := abs(sx - dx);

ry := abs(sy - dy);

writeln('Минимальное кол-во ходов по Чебышёву:');

if rx > ry then

writeln(rx)

else

writeln(ry);

end;

var

a, b, c, d: integer;

begin

writeln('Введите координаты точки s:');

readln(a, b);

writeln('Введите координаты точки f:');

readln(c, d);

if ((a < 1) or (a > 8) or (b < 1) or (b > 8) or (c < 1) or (c > 8) or (d < 1) or (d > 8)) then

writeln('Ошибка! Проверьте правильность введённых данных! Закрытие программы... ')

else

minh(a, b, c, d);

cheb(a, b, c, d);

readln;

end.


На шахматной доске размером 8 на 8 в клетке s находится король. Определите, за какое минимальное кол
4,7(20 оценок)
Открыть все ответы
Ответ:
2003tanya
2003tanya
19.07.2020
Петя не может быть правым в обоих случаях так как получиться что и петя и женя написали на 5, а тк не может быть по условию. дальше подбираем под петю два оставшихся случая, при том что петя сказал 2 раза правду, но этого не может быть т.к. тогда женя говорит либо 2 неправды либо 50на50, говоря две неправды он противоречит пете о том что он не писал на 5 а говоря правду неправду противоречит и пете и саше. значит петя определенно сказал правду неправду, тогда подставив жене неправду а саше правду получаем что на 5 написал петя.
4,6(77 оценок)
Ответ:
TyanochkaTyan
TyanochkaTyan
19.07.2020
Паскаль
---
uses crt;
var a: array[1..100,1..100] of integer;
    x,y,sum,k,n:integer;
begin
     write('Введите n: ');
     readln(n);
     clrscr;
     for x:=1 to n do begin
         for y:=1 to n do begin
             a[x,y]:=random(21)-10;
             write(a[x,y]:4);
         end;
         writeln;
     end;
     k:=0;
     Sum:=0;
     for x:=1 to n do
         for y:=x+1 to n do
             if a[x,y]>0 then begin
                Sum:=Sum+a[x,y];
                inc(k);
             end;
     writeln;
     if k<>0 then write(sum/k:4:2);
end.
4,6(76 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ