Помощ за рекурсивен ООП алгоритъм


0

 Накратко, след първото решение на задачата за 8-те кралици ми се преиска да измисля по-елегантно с обекти.

 Явно пропускам нещо, защото вместо 92 се появяват 467 решения. 

Къде може да е грешката? Да не би заради създаването на обект при всяка стъпка на рекурсията, да се влиза във второ измерение на рекурсия?

 Това е кода:

http://pastebin.com/6RxGhs2K - основния клас на задачата

http://pastebin.com/2NQpiewk - класът кралица




Отговори



1

дъното на рекурсията. защо:

if (currentQueen.Column == numberOfQueens)

ако царицата ти е на 8 foundSolutions++




0
Идеята е, че последната кралица вече е поставена и се влиза в колоната, която вече е извън полето. Там рекурсията свършва, решението се принтира и се връщаме на последната колона, където търсим друг ред на който да се сложи последната кралица.
Уж двете решения ползват една и съща логика, едното работи-другото не. Разликата е че при работещото се проверява матрицата на игралното поле за поставени кралици, а при неработещото се проверяват координатите на обектите-кралици.

от ivan.mihov1 (4988 точки)


1
Алгоритъмът ти за поставяне на "кралиците" е сгрешен. Пусни си кода в дебъг режим - още на първата матрица се вижда, че има "кралици", които се атакуват взаимно.
На пръв поглед, което виждам е, че май проверяваш позицията на следващата "кралица" само спрямо позицията на предходната, а не спрямо позициите на всички преходни.

от Drago (711 точки)


0
Ще проверя по-обстойно. Струваше ми се, че точно там може да има грешка, но така и не я открих.

от ivan.mihov1 (4988 точки)


0
 Мерси за всички насоки, оправих я.
 
Както каза колегата от последното мнение, проверката за всички кралици не работеше добре, което се оправи с добавянето на един ред на 65: isChecked = false; Този ред прави така, че да се проверява и за атака от първата кралица, без него тя не се проверява.
 
 Също логиката ми за дъното на рекурсията беше грешна. Защото след като поставя 8-мата кралица, търся къде да сложа девета за да завърша рекурсията. Т.е. трябва currentQueen.Column == numberOfQueens - 1. 
 
 С тези две корекции задачата стана пушка.

от ivan.mihov1 (4988 точки)