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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 28.01.2010, 00:35   #1
Evgeniy21
 
Регистрация: 28.01.2010
Сообщений: 3
По умолчанию Обход конем шахмотной доки

С горем пополам была написана програма для подщета количества вариантов обхода шахматной доски размером м на н при доске размером до 5 на 5 включительно програма работает но с доской большего размера она зависает. Как оптимизировать код для подщета на доске хотябы 8 на 8
Const
Dx:array[1..8] of integer=(-2,-1,1,2,2,1,-1,-2);
Dy:array[1..8] of integer=(1,2,2,1,-1,-2,-2,-1);
Var A:array of array of integer;
t,n,m:integer;
Procedure Solve(k,y,q:Integer);
Var z,i,j:Integer;
Begin

A[k,y]:=q; //помечаем клетку как пройденную
for z:=Low(Dx) To High(Dx) do
begin
i:=k+Dx[z];
j:=y+Dy[z];

//проверяем что очередной ход не выходит за пределы доски
if (i >= 0) and (i < N) and (j >= 0) and (j < M) and
(A[i,j] = 0) Then //и клетка еще не пройдена
begin
If q+1 = N*M Then //прошли все клетки
begin
Inc(t);
Break;
end;
Solve(i,j,q+1);
end;
end;
A[k,y]:=0; //сбрасываем признак прохождения клетки
end;

procedure TForm3.Button1Click(Sender: TObject);
var i,j:integer;
begin
M:=strtoint(edit1.Text);
N:=strtoint(edit2.Text);
SetLength(A,N,M); //зануляет все элементы А
ProgressBar1.Max:=n*m;
t:=0;
For i:=0 To N-1 Do
For j :=0 To M-1 Do Solve (i,j,1) ;
Label3.Caption:=('число способов обхода конем доски '+inttostr(N)+'*'+
inttostr(M)+'= '+inttostr(t));
end;
Evgeniy21 вне форума
Старый 28.01.2010, 01:16   #2
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Это в универе научили столь гениально пользоваться рекурсией, или сами придумали?
Полный рекурсивный перебор - гениальная идея, ничего не скажешь. Подозреваю, что все же с помощью универа/учебника/гугла, так как только они могут подбросить такие "очень умные" идеи.
Но даже если ту же идею реализовать линейно и с некоторыми попытками оптимизации - ничего не получится.
Вынужден расстроить - задача класса NP. Если нужны более оптимальные реализации и идеи, как сильно сократить время работы программы - "спишите с умных источников", посмотрите хотя бы в "сравнительно умной" ВикиПедии на Гамильтонову проблему. Там есть идеи и пути оптимизации, но оно сдесь глобально не поможет.
LeBron вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ход конем Etlau Помощь студентам 3 28.05.2010 19:16
Методы решения задач типа: ход конем Levsha100 Свободное общение 14 01.10.2009 19:33
Задача "Ход конем" WormsSs Общие вопросы C/C++ 14 29.11.2008 16:25
Пример технического задания и доки в кадре проекта lexluther Свободное общение 1 11.01.2007 12:23