Ход конем

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Ответить
msn
Сообщения: 2
Зарегистрирован: 25 авг 2005, 10:56

Подскажите алгоритм заполнения щахматной доски таким образом как ходит шахматный конь.
спасибо.
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Он прост пишешь рекурсивную функцию:
Функция попытка следующего хода
пока ход был удачным или нет других возможных ходов повторять
выбрать следующий ход
1) если ход удачный записать ход; если доска не заполнена (< 64 ходов) попытка следующего хода
2) иначе стереть предыдущий ход
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

интересная задачка... описал вышеописанный алгоритм в дельфи:

Код: Выделить всё

procedure FillIt;
var
  cells: array[0..7, 0..7] of Integer;

  procedure DrawCells(N, M: Integer);
  var
    i, j: Integer;
  begin
    for i := 0 to 7 do
      for j := 0 to 7 do
        if cells[i, j] = 0
        then Form1.StringGrid1.Cells[i, j] := ''
        else Form1.StringGrid1.Cells[i, j] := IntToStr(cells[i, j]);

    Form1.Label1.Caption := IntToStr(N);
    Form1.Label2.Caption := IntToStr(M);
  end;

  function IsMoveIsPosible(X, Y: Integer; Move: Integer): Boolean;
  begin
    Result :=
      (X+moves[Move].X >= 0) and (X+moves[Move].X < 8) and
      (Y+moves[Move].Y >= 0) and (Y+moves[Move].Y < 8);
    if Result then Result := Cells[X+moves[Move].X, Y+moves[Move].Y] = 0;
  end;

  procedure FillFromPoint(X, Y: Integer; var N: Integer; M: Integer; var stop: Boolean);
  var i, p: Integer;
  begin
    stop := M = 64;
    Cells[x, y] := M;
    p :=StrToInt(Form1.Label2.Caption);
    if M > P then begin
      Form1.Label1.Caption := IntToStr(N);
      Form1.Label2.Caption := IntToStr(M);
      DrawCells(N, M);
      Application.ProcessMessages;
    end;
    inc(N); inc(M);
    For i := 1 to 8 do
    begin
      if stop then exit;
      if IsMoveIsPosible(x, y, i) then FillFromPoint(X+moves[i].x, Y+moves[i].y, N, M, stop);
    end;
    Cells[x, y] := 0;
  end;
var
  i, j: Integer;
  stop: Boolean;
begin
  For i := 0 to 7 do
    For j := 0 to 7 do
      Cells[i,j] := 0;
  i := 1; stop := False;
  FillFromPoint(0, 0, i, 1, stop);
  ShowMessage('ok!');
end;
первое совпадение, т.е. полное заполнение происходит на 8 250 733 проверке.
С уважением, Lost Angel...
Ответить