Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2012, 15:08   #1
yzen
Пользователь
 
Регистрация: 02.10.2012
Сообщений: 37
По умолчанию Из k,l в m,n за 2 хода

Поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит восьми: первое число — номер вертикали (при счете слева направо), второе — номер горизонтали (при счете снизу вверх). Даны натуральные числа k, l, m, n, каждое из которых не превосходит восьми. Требуется:
Выяснить, можно ли с поля (k, l) одним ходом конь попасть на поле (m, n). Если нет, то выяснить, как это можно сделать за два хода (указать поле, на которое приводит первый ход).
Предполагается, что указанные поля имеют один и тот же цвет.

Нужно на паскале

Сделал как за один ход,а как за два не получается.
yzen вне форума Ответить с цитированием
Старый 20.10.2012, 15:20   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Не получается в коде программы или идей просто нет?
Я так думаю, что рекурсивно вызывать ту же функцию вычисления, что и для одного хода, пока k<>m,l<>n и количество рекурсий <2
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 20.10.2012, 15:47   #3
yzen
Пользователь
 
Регистрация: 02.10.2012
Сообщений: 37
По умолчанию

Код:
uses crt;
var k,l,m,n,x,y,s:integer;
begin

repeat
writeln('Введите начальные координаты коня k,l');
readln(k,l);
until (k in [1..8])and(l in [1..8]);
repeat
writeln('Введите конечные координаты коня m,n');
readln(m,n);
until (m in [1..8])and(n in [1..8]) and((k<>m)and(l<>n));
x:=abs(k-m);
y:=abs(l-n);
if ((x=2)and (y=1)) or ((x=1) and (y=2)) then writeln('Можно за один ход.');



end.
для проверки за один ход я сделал так
а как дальше, проверить за 2 хода
yzen вне форума Ответить с цитированием
Старый 20.10.2012, 16:01   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Как-нибудь так:

Код:
uses crt;
var k,l,m,n,x,y,s,count:integer;

function Proverka(a,b: byte): boolean;
begin
  x:=abs(a-m);
  y:=abs(b-n);
  if ((x=2)and (y=1)) or ((x=1) and (y=2)) then Proverka:=true
  else if count<>2 then begin
    count:=count+1;
    Proverka(a+x,b+y);
  end
  else Proverka:=false;
end;

begin
  repeat
    writeln('Введите начальные координаты коня k,l');
    readln(k,l);
  until (k in [1..8])and(l in [1..8]);
  repeat
    writeln('Введите конечные координаты коня m,n');
    readln(m,n);
  until (m in [1..8])and(n in [1..8]) and((k<>m)and(l<>n));
  count:=1;
  If Proverka(k,l) then WriteLn('Можно за ',count,' ход(а)')
  else WriteLn('нельзя');
  ReadLn;
end.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 20.10.2012, 16:15   #5
yzen
Пользователь
 
Регистрация: 02.10.2012
Сообщений: 37
По умолчанию

Спасибо)
оставил отзыв)
но мог бы еще помочь с указанием 1 первого хода, когда за два
yzen вне форума Ответить с цитированием
Старый 20.10.2012, 18:45   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Sciv, не знаю, в чем дело, но Ваша программа говорит "возможно за 2 хода" при любых входных данных - http://ideone.com/sZN5Xi.
19:18 Update Мой вариант (очень топорный - наверное, можно сделать красивее, и нету гарантий правильной работы )
Код:
uses
  crt;

var
  k, l, m, n, count, x, y: integer;

function check(x1, y1, x2, y2: integer; var count, x, y: integer): boolean;
var
  t: boolean;
begin
  check := false;
  if (not (x1 in [1..8])) or (not (y1 in [1..8])) then
    exit;
  if count > 2 then
    exit;
  if (x1 = x2) and (y1 = y2) then
  begin
    check := true;
    exit;
  end;
  inc(count);
  t := check(x1 + 2, y1 + 1, x2, y2, count, x, y) or
    check(x1 + 2, y1 - 1, x2, y2, count, x, y) or
    check(x1 - 2, y1 + 1, x2, y2, count, x, y) or
    check(x1 - 2, y1 - 1, x2, y2, count, x, y) or
    check(x1 + 1, y1 + 2, x2, y2, count, x, y) or
    check(x1 + 1, y1 - 2, x2, y2, count, x, y) or
    check(x1 - 1, y1 + 2, x2, y2, count, x, y) or
    check(x1 - 1, y1 - 2, x2, y2, count, x, y);
  if t = true then
  begin
    check := true;
    if x = -1 then
    begin
      x := x1;
      y := y1;
    end;
  end
  else
    dec(count);
end;

begin
  x := -1;
  repeat
    writeln('Введите начальные координаты коня k, l:');
    readln(k, l);
  until (k in [1..8]) and (l in [1..8]);
  repeat
    writeln('Введите конечные координаты коня m, n:');
    readln(m, n);
  until (m in [1..8]) and (n in [1..8]);
  count := 0;
  if (k = m) and (l = n) then
    writeln('Одна и та же точка')
   else
  if check(k, l, m, n, count, x, y) then
    if count = 2 then
      WriteLn('Можно за 2 хода. Промежуточная точка: (', x, ',', y, ')')
    else
      writeLn('Можно за 1 ход')
  else
    WriteLn('Нельзя попасть за 2 хода');
  ReadLn;
end.
13:45 Update
Цитата:
И когда начальная=конечной она не правильно работает.
Да, забыл об этом случае - код исправлен.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.10.2012 в 13:45.
BDA вне форума Ответить с цитированием
Старый 20.10.2012, 19:11   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

BDA, я знаю.
Топикстартер, дико извиняюсь, программа недоделана, но, думаю, идея понятна.

Дело в том, что я поспешил (нужно было отбежать по делам) и отправил сырой вариант (я бы даже сказал, мокрый)
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 20.10.2012, 21:50   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Вот вроде доделал...

Код:
Program Prog;

uses
  crt;

var k,l,m,n,count:byte;

function Proverka(a,b: byte;var c: byte): boolean;
var Res: boolean;
    x,y: integer;
begin
  Res:=false;
  if (a<=8) and (a>=1) and (b<=8) and (b>=1) then begin
    x:=abs(m-a);
    y:=abs(n-b);
    Res:=((x=2)and (y=1)) or ((x=1) and (y=2));
    inc(c);
    if not Res and (c<>2) then
      Res:=Proverka(a+1,b+2,c) or Proverka(a+1,b-2,c) or Proverka(a-1,b+2,c) or Proverka(a-1,b-2,c) or
           Proverka(a+2,b+1,c) or proverka(a+2,b-1,c) or Proverka(a-2,b+1,c) or Proverka(a-2,b-1,c);
    if not Res then dec(c);
  end;
  Proverka:=Res;
end;

begin
  repeat
    writeln('Введите начальные координаты коня k,l');
    readln(k,l);
  until (k in [1..8])and(l in [1..8]);
  repeat
    writeln('Введите конечные координаты коня m,n');
    readln(m,n);
  until (m in [1..8])and(n in [1..8]);
  count:=0;
  If Proverka(k,l,count) then
    WriteLn('Можно за ',count,' ход(а)')
  else
    WriteLn('нельзя');
  ReadLn;
end.
Потестил по-быстрому - работает вроде правильно, с учетом краев поля и тп.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 21.10.2012, 11:40   #9
yzen
Пользователь
 
Регистрация: 02.10.2012
Сообщений: 37
По умолчанию

Все отлично работает.
Правда еще твою программу не до понял не много.

И когда начальная=конечной она не правильно работает.

Ну и на этом спасибо.
yzen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задержка хода противника LiuLiuJons C++ Builder 8 19.04.2012 17:33
Алгоритм выбора лучшего хода tanyhaftv Помощь студентам 4 09.06.2011 17:55
Пузырьки:алгоритм лучшего хода SynEnergizer Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 05.12.2009 16:18
Как сделать имитацию хода даты и времени в программе? Bill Gates Общие вопросы Delphi 1 06.01.2008 15:21
Как сделать имитацию хода даты и времени в программе? Bill Gates Общие вопросы Delphi 1 05.01.2008 22:42