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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2009, 01:42   #1
Ирёнок
 
Регистрация: 20.02.2009
Сообщений: 6
Восклицание Ходы конём (pascal)

Подскажите пожалуйста! Есть такая игра,.. задача логическая, "Ход конём". Нужно написать программу, которая будет решать эту задачу. Суть игры: заполнить шахматные клетки цифрами от 1 до 64 (доска 8х8) идя конём. Есть формула: i:=i+ci[k], j:=j+cj[k], где i и j - координаты следующей цифры.

Это то, что есть:
Код:
uses crt;
const
     ci:array [1..8] of integer=(-1,-1,-2,-2,1,1,2,2);
     cj:array [1..8] of integer=(2,-2,1,-1,2,-2,1,-1);
type
    mas=array[1..8,1..8] of integer;
var
   a:mas;
   i,j,k,n:integer;

   procedure shag(var a:mas; var i,j,n:integer);
             begin
                  for k:=1 to 8 do
                      if a[i+ci[k],j+cj[k]]=0 then
                      begin
                      i:=i+ci[k];
                      j:=j+cj[k];
                      a[i,j]:=n;

             end;

begin
     clrscr;
     i:=1;
     j:=1;
     for n:=2 to 64 do
              shag(a,i,j,n);
     for i:=1 to 8 do
         for j:=1 to 8 do
             begin
             write(' 'a[i,j],' ');
             if j=8 then writeln;
             end;
     readln;
end.

Последний раз редактировалось rpy3uH; 19.03.2009 в 07:47.
Ирёнок вне форума Ответить с цитированием
Старый 19.03.2009, 09:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Дык а что требуется?
Чего подсказывать то?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2009, 10:21   #3
Ирёнок
 
Регистрация: 20.02.2009
Сообщений: 6
По умолчанию

Проблема в правильной постановке условий и циклов. Есть процедура, которая делает 1 ход, если тупик, то она делает шаг назад, есди и оттуда нельзя больше хода сделать- ещё шаг назад и.т.д. до тех пор поку не найдёт позицию, с которой можно продолжить.
Ирёнок вне форума Ответить с цитированием
Старый 19.03.2009, 12:15   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну вот ябы делал примерно так:
В цикле от клетки (0,0) начал подниматься так:
1. Три_вверх-Один_вправо
2.Три_вверх-Один_влево
3. Один_вверх-Три_вправо

Потом тоже самое но вниз
И так четыре (если не ошибаюсь) раза.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2009, 13:10   #5
Ирёнок
 
Регистрация: 20.02.2009
Сообщений: 6
По умолчанию

Конь начинает ходить с позиции (1,1).
Ирёнок вне форума Ответить с цитированием
Старый 21.03.2009, 10:50   #6
Ирёнок
 
Регистрация: 20.02.2009
Сообщений: 6
По умолчанию

uses crt;
const
ci:array [1..8] of integer=(1,2,-1,-1,-2,-2,2,1);
cj:array [1..8] of integer=(2,1,2,-2,1,-1,-1,-2);
type
mas=array [1..8,1..8] of integer;
mas2=array [1..64] of integer;
var
a:mas;
i,j,n,k,b:integer;
r:mas2;

procedure shag(var a:mas; var i,j,n,k:integer; var r:mas2);
begin
i:=i+ci[k];
j:=j+cj[k];
a[i,j]:=n;
r[n]:=k;
writeln(a[i,j],' ',i,' ',j,' ',k,' ',r[n]);
readln;
end;

begin
clrscr;
i:=1;
j:=1;
a[1,1]:=1;
k:=1;
for n:=2 to 64 do
begin
if (a[i+ci[k],j+cj[k]]=0) and (i+ci[k]<=8) and (j+cj[k]<=8) and (i+ci[k]>=1) and (j+cj[k]>=1) then
begin shag(a,i,j,n,k,r); k:=1; end
else if ((a[i+ci[k],j+cj[k]]<>0) or (i+ci[k]>8) or (j+cj[k]>8) or (i+ci[k]<1)or(j+cj[k]<1))and(k<8)then
begin
k:=k+1;
n:=n-1;
writeln(k,' ',n);
end
Вот когда дело доходит до этого условия он должен делать шаг назад, но почему-то не получается
else if ((a[i+ci[k],j+cj[k]]<>0) or (i+ci[k]>8)or(j+cj[k]>8)or(i+ci[k]<1)or(j+cj[k]<1))and((k=8)or(k=r[n-1]))then
begin
b:=r[n-2];
i:=i-ci[r[n-2]];
j:=j-cj[r[n-2]];
n:=n-2;
k:=1;
writeln(i,' ; ',j,' ; ',n,' ; ',k,' ; ',r[n],' ; ',a[i,j],' ; ',b);readln;
end;
end;
readln;
end.
Ирёнок вне форума Ответить с цитированием
Старый 22.03.2009, 01:34   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Как-то Вы слишком усложняете условия. Ниже код - примерное решение. Только вряд ли Вы дождетесь в обозримое время результата. Эта задача решается по другому. Попробуйте что-нибудь почитать на эту тему. Вот, например:

Классические задачи программирования

Код:
type mas = array[1..8,1..8] of integer;

const // Возможные перемещения из текущей клетки
   Delta:array [1..8, 1..2] of integer=
     ( ( 1,  2), ( 1, -2), (-1,  2), (-1, -2),
       ( 2,  1), ( 2, -1), (-2,  1), (-2, -1) );

function NextStep(var a:mas;
                   x0, y0 : integer;     // Проверяемая позиция
                   N : integer           // Следующий номер
                  ):boolean;

var i, xn, yn: integer;
begin
   a[x0, y0] := N;                       // ставим коня
   result := N = 64;                     // Если все клетки заполнены
   if result then exit;                  // задача решена

   for i := 1 to 8 do begin              // Проверяем все возможные ходы
      xn := x0 + Delta[i, 1];            // Вычисляем новую позицию
      yn := y0 + Delta[i, 2];
      // Координаты должны быть в пределах доски
      if not ((xn in [1..8]) and (yn in [1..8])) then continue;
      // Клетка должна быть не занята
      if a[xn, yn] <> 0 then continue;
      // Пробуем пойти дальше
      result := NextStep(a, xn, yn, N+1);
      // Если удалось заполнить задача решена
      if result then exit;
   end;
   // Если не удалось, убираем коня
   {if not result then }a[x0, y0] := 0;
end;

var i, j:integer;
    a:mas;
begin
   FillChar(a, 0, sizeOf(a));           // Очистили поле
   if NextStep(a, 1, 1, 1) then begin   // Пробуем заполнить
alexBlack вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод кода из Pascal в Object Pascal zemskov77 Общие вопросы Delphi 1 03.01.2009 09:37
Need help, Pascal Бедный студент Помощь студентам 0 31.05.2008 01:38