Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 196

/ вопрос открыт /

Здравствуйте, эксперты!

Описать логическую функцию HodLadia(pole1,pole2), проверяющую может ли ладья за один ход перейти с pole1 на pole2 шахматной доски, использовать типы:
Veryical= (a,b,c,d,e,f,g,h) и
Pole = record
Vert: Vertical;
Horiz: 1..8
end;

istra Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: istra (статус: Посетитель)
Вопрос отправлен: 13 декабря 2007, 19:45
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Николай Рубан

Здравствуйте, istra!

type Vertical = (a,b,c,d,e,f,g,h);
      Pole = record
                Vert: Vertical;
                Horiz: 1..8
             end;
function HodLadia(pole1,pole2:Pole):Boolean; {функция возвращает значение TRUE,
если ладья может за один ход перейти с pole1 на pole2, и FALSE в противном случае}
begin
  Result:=(pole1.Vert=pole2.Vert) or (pole1.Horiz=pole2.Horiz);
end;
 
var p1,p2:Pole;
begin
  p1.Vert:=b;  p1.Horiz:=2; {ввод данных}
  p2.Vert:=b;  p2.Horiz:=3;
  writeln(HodLadia(p1,p2)); {вывод результата}
  readln;
end.

Но есть одно НО при данном типе Вам будет проблематично ввести данные в поле Vert: Vertical;, поскольку оно описано пользовательским типом и для ввода данных прийдется дополнительно организовывать обработку данных. Поэтому предлагаю Вам немного видиизменитьь тип до такого вида:
Vertical = 'a'..'h';
Соответственно Вам прийдется вводить данные классического символьного типа (char). Например так:
var p1,p2:Pole;
begin
  readln(p1.Vert); readln(p1.Horiz);
  readln(p2.Vert); readln(p2.Horiz);
  writeln(HodLadia(p1,p2));
  readln;
end.

Good Luck!!!

Ответ отправил: Николай Рубан (статус: 10-ый класс)
Время отправки: 13 декабря 2007, 20:24
Оценка за ответ: 4

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, istra!
сделаю поправку к предыдущему ответу.
Во первых, ладья не может пойти в ту же клетку, в которой она стоит на данный момент, точнее это не есть ходом.
Поэтому в функции нужно исправить. и второе, ладья, в отличии от коня не может прыгать через другие фигуры, хотя может стать на место фигуры противоположного цвета.

type Horizontal = 1..8;
function HodLadia(pole1,pole2:Pole):Boolean; {функция возвращает значение TRUE,
если ладья может за один ход перейти с pole1 на pole2, и FALSE в противном случае}
var
     V: Vertical;
     h:Horizontal;
begin
  Result:=(pole1.Vert=pole2.Vert) xor (pole1.Horiz=pole2.Horiz);
  if not result then exit; //дальше бессмысленно делать проверки.
  if pole1.Vert=pole2.Vert then
  begin
    for h := pole1.horiz to pred(pole2.horiz) do
      if not check(h,pole1.Vert) then begin result := false; exit;end;
    for v := pole1.vert to pred(pole2.vert) do
      if not check(pole1.horiz,v) then begin result := false; exit;end;
    result := true;
  end;
end;
где check(h:Horizontal; v:vertical):boolean; - функция, которая проверяет, свободна ли клетка.
в коде есть небольшой допуск - я предположил, что pole2.horiz > pole1.horiz и pole2.vert > pole1.vert, но я думаю, вы с этим справитесь:)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 14 декабря 2007, 01:17
Оценка за ответ: 5


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 июня 2017, 16:48
Выполнено за 0.05 сек.
Рейтинг@Mail.ru