![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 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; |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 10.10.2009
Сообщений: 680
|
![]()
Это в универе научили столь гениально пользоваться рекурсией, или сами придумали?
Полный рекурсивный перебор - гениальная идея, ничего не скажешь. Подозреваю, что все же с помощью универа/учебника/гугла, так как только они могут подбросить такие "очень умные" идеи. Но даже если ту же идею реализовать линейно и с некоторыми попытками оптимизации - ничего не получится. Вынужден расстроить - задача класса NP. Если нужны более оптимальные реализации и идеи, как сильно сократить время работы программы - "спишите с умных источников", посмотрите хотя бы в "сравнительно умной" ВикиПедии на Гамильтонову проблему. Там есть идеи и пути оптимизации, но оно сдесь глобально не поможет. |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ход конем | 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 |