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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2011, 21:29   #1
skorpi
Пользователь
 
Регистрация: 24.12.2009
Сообщений: 11
По умолчанию Ход конем

Два коня поочередно делают обход поля NxN, произвольного размера.
В каждой клетке нужно побывать один раз.
Подскажите, пожалуйста, как это осуществить програмно, или сам алгоритм.
С обходом одним конем разобрался, а дальше ????
Код:
Program hod_konya;
Uses Crt;
const n=8; nsq=64;
type index=1..n;
var i,j:index;
    q:boolean;
    s:set of index;
    a,b:array[1..8] of integer;
    h:array[index,index] of integer;

procedure try (i:integer; x,y:index; var q:boolean);
    var k,u,v:integer; q1:boolean;
begin k:=0;
   repeat k:=k+1; q1:=false;
       u:=x+a[k]; v:=y+b[k];
       if (u in s) and (v in s) then
       if h[u,v]=0 then
       begin h[u,v]:=i;
          if i<nsq then
             begin try (i+1,u,v,q1);
                if not q1 then h[u,v]:=0;
             end else q1:=true
		end
    until q1 or (k=8);
    q:=q1;
end {try};
begin s:=[1,2,3,4,5,6,7,8];
   a[1]:=2;  b[1]:=1;
   a[2]:=1;  b[2]:=2;
   a[3]:=-1; b[3]:=2;
   a[4]:=-2; b[4]:=1;
   a[5]:=-2; b[5]:=-1;
   a[6]:=-1; b[6]:=-2;
   a[7]:=1; b[7]:=-2;
   a[8]:=2; b[8]:=-1;
   for i:=1 to n do
       for j:=1 to n do h[i,j]:=0;
	h[1,1]:=1; try (2,1,1,q); TextColor(10);
    if q then
        for i:=1 to n do
        begin for j:=1 to n do write(h[i,j]:4);
           writeln;
           writeln;
        end
    else writeln('NO SOLUTION');
         readln;
         clrscr;
end.
skorpi вне форума Ответить с цитированием
Старый 08.09.2011, 07:51   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от skorpi Посмотреть сообщение
Два коня поочередно делают обход поля NxN, произвольного размера.
В каждой клетке нужно побывать один раз.
Подскажите, пожалуйста, как это осуществить програмно, или сам алгоритм.
С обходом одним конем разобрался, а дальше ????
Алгоритм тут простой, я бы сказал - никакой )). Называется "полный перебор с помощью рекурсии". При этом совершенно не важно, сколько коней, моя прога годится как для одного коня, так и для десяти )).

Давай, разбирайся. Отвечу на любые вопросы.
Код:
const
  n= 3;  // board size
  m= 2;  // number of horses

type
  tPos= record
    x,y: integer;
  end;

var
  Board: array[1..n,1..n] of integer;

const
  Horse: array[1..m] of tPos= ((x:1;y:1),(x:1;y:2));  // initial positions

function HorseMove(MoveNum: integer; HorseNum: byte): boolean;
const
  z: array[1..2] of ShortInt= (-1,1);
var
  i,j,h,v,a,b: integer;
begin
  with Horse[HorseNum] do begin
    Board[x,y]:= MoveNum;
    if MoveNum=n*n then begin  // тут была ошибка, исправлено
      for i:=1 to n do begin
        for j:=1 to n do Write(Board[i,j]:3);
        WriteLn
      end;
      Halt
    end;
    for h:=1 to 2 do
      for v:=1 to 2 do
        for i:=1 to 2 do
          for j:=1 to 2 do
            if i<>j then begin
              a:= x+z[h]*i;
              b:= y+z[v]*j;
              if (0<a)and(0<b)and(a<=n)and(b<=n) and (Board[a,b]=0) then begin
                x:= a;
                y:= b;
                HorseMove(MoveNum+1,HorseNum mod m+1)
              end
            end;
    Board[x,y]:=0
  end
end;

begin
  FillChar(Board,SizeOf(Board),0);
  HorseMove(1,1);
  WriteLn('complete round of ',n,'x',n,' board with ',m,' horses from given positions is not possible')
end.
Тут рассматривается только одна начальная позиция. Если нужно рассмотреть все возможные (то есть сделать вывод о принципиальной возможности обхода из произвольной точки), то надо добавить перебор начальных позиций тоже (надо подумать, как).
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 08.09.2011 в 09:04.
TinMan вне форума Ответить с цитированием
Старый 08.09.2011, 08:17   #3
skorpi
Пользователь
 
Регистрация: 24.12.2009
Сообщений: 11
По умолчанию

Спасибо большое за поддержку! Буду разбираться.
skorpi вне форума Ответить с цитированием
Старый 08.09.2011, 09:03   #4
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

[QUOTE=skorpi;873355]Спасибо большое за поддержку! Буду разбираться./QUOTE]Пожалуйста )). Только погоди - там в коде небольшая опечатка была (осталась от тестирования). Строчка
if MoveNum=n*n-1 then begin
- должна выглядеть так:
if MoveNum=n*n then begin
Я допишу этот мессадж и исправлю в том.

Кроме прочего, я подумал, что сам алгоритм совершения хода я сделал громоздкий. Можно сделать попроще. Вот новый вариант:
Код:
const
  n= 8;  // board size
  m= 2;  // number of horses

type
  tPos= record
    x,y: integer;
  end;

var
  Board: array[1..n,1..n] of integer;

const
  Horse: array[1..m] of tPos= ((x:1;y:1),(x:1;y:2));  // initial positions

function HorseMove(MoveNum: integer; HorseNum: byte): boolean;
const
  d: array[1..8] of tPos= ((x:2;y:1),(x:1;y:2),(x:-1;y:2),(x:-2;y:1),(x:-2;y:-1),(x:-1;y:-2),(x:1;y:-2),(x:2;y:-1));
var
  i,j,a,b: integer;
begin
  with Horse[HorseNum] do begin
    Board[x,y]:= MoveNum;
    if MoveNum=n*n then begin
      for i:=1 to n do begin
        for j:=1 to n do Write(Board[i,j]:3);
        WriteLn
      end;
      Halt
    end;
    for i:=1 to 8 do begin
      a:= x+d[i].x;
      b:= y+d[i].y;
      if (0<a)and(0<b)and(a<=n)and(b<=n) and (Board[a,b]=0) then begin
        x:= a;
        y:= b;
        HorseMove(MoveNum+1,HorseNum mod m+1)
      end
    end;
    Board[x,y]:=0
  end
end;

begin
  FillChar(Board,SizeOf(Board),0);
  HorseMove(1,1);
  WriteLn('complete round of ',n,'x',n,' board with ',m,' horses from given positions is not possible')
end.
Жду вопросов.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ход конем на Turbo C darst Общие вопросы C/C++ 2 18.01.2011 20:37
Ход конем Etlau Помощь студентам 3 28.05.2010 19:16
Ход конем на Си Ekатерина Помощь студентам 2 02.05.2010 15:41
ход конем Zuuu92 Паскаль, Turbo Pascal, PascalABC.NET 1 29.04.2010 22:16
Методы решения задач типа: ход конем Levsha100 Свободное общение 14 01.10.2009 19:33