Динамическое построение дерева с рекурсивным возвратом

У меня есть эта проблема, что мне нужно решить проблему рекурсивного возврата. Она очень похожа на проблему n ферзей, но отличается тем, что в ней используются разные кандидаты на асимметричной доске. Всего есть четыре разных кандидата, каждый из которых зависит от одного и другого. У меня 2 туза, 2 короля, 2 дамы и 2 валета. Каждый туз должен быть рядом (по горизонтали или вертикали) с королем, каждый король должен быть рядом с дамой, а каждая дама должна быть рядом с валетом, и ни одна из фигур не может иметь дубликатов рядом с собой. Доска с правильным решением выглядит так:

Grid (y, x)(only the positions between *y,x* are available for candidates): 
4,1 4,2 *4,3* 4,4
3,1 *3,2* *3,3* *3,4*
*2,1* *2,2* *2,3* 2,4
1,1 1,2 *1,3* 1,4

Possible Solution
. . K . 
Q J Q .
. A K A
. . J .

Теперь моя проблема в том, что я хочу использовать дерево для отслеживания кандидатов в качестве родителей и детей дерева. Я еще не реализовал дерево, но мне было интересно, является ли метод, показанный в этом примере, хорошим способом создания дерева. И если это хороший способ создать дерево, с чего мне начать, как дерево узнает, к какому родителю оно должно быть дочерним, а также вернуться, когда решение не подходит?

Надеюсь, я добавил достаточно информации об этой ситуации, заранее спасибо.


person Bas    schedule 11.02.2011    source источник


Ответы (1)


Я могу ошибаться здесь, но, похоже, вы не совсем поняли, как должен работать алгоритм рекурсивного поиска в этом случае. Древовидная структура, которую вы хотите построить, обычно не реализуется явно, вместо этого это структура рекурсивных вызовов, которая будет выглядеть как дерево поиска. Если вы посмотрите на реализацию псевдокода здесь http://en.wikipedia.org/wiki/Backtracking , вы увидите, что древовидная структура не задействована, а возврат (выполняемый, когда reject возвращает true) выполняется просто путем возврата из текущего вызова.

В вашем случае вы можете захотеть выполнить поиск в одной структуре данных вместо ее копирования, поэтому откат означает удаление части кандидата, которую вы только что вставили, а затем возврат.

person Bols    schedule 12.02.2011
comment
Я работал над решением некоторое время, и я, наконец, нашел правильное решение! Вы были правы, я пропустил интерпретацию алгоритма поиска с возвратом в реализации дерева. Я реализовал это без дерева, и это работает :) Спасибо, что позволили мне подумать об этом по-другому;) - person Bas; 15.02.2011