|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Oct 2008
Messaggi: 21
|
[C] Algoritmo di Backtraking per 8 Regine
Salve sono nuovo del forum... da un pò di giorni sto sbattendo la testa sul problema del posizionamento di N regine su una scacchiera NxN senza pero' che esse si tengano sotto scacco.
Il codice stilato da me attualmente e' il seguente: void NQueens( int Board[][MaxBoardSize], int Size, int Riga, int Col, long int *TotSolution, int Soluzione[], int IdxBack ) { .if(Riga < Size) ..{ ...if( Col < Size ) /* Valido controlla se la regina pozisionata nel posto Riga,Col e' sottoscacco tornando 1 o 0 */ ....if( Board[Riga][Col] == 0 )//Ho trovato una cella libera e colloco la Regina .....{ ......Mark(Board, Size, Riga, Col, 1);//Setta a +1 le celle guardate dala regina ......Soluzione[Riga]=Col;//Array delle soluzioni trovate contentente l' indice dicolonna della regina posizionata ......if(Riga == Size-1) .......*TotSolution+=1; //Ho trovato una soluzione ......NQueens(Board, Size, Riga+1, 0, TotSolution, Soluzione, IdxBack); .....} ....else /* Provo ad inserire la Regina nella colonna successiva mantenendoo la riga */ NQueens(Board, Size, Riga, Col+1, TotSolution, Soluzione, Col); ...else ....{ /* Non sono riucito a mettere una regina torno alla riga precendente e provo con una nuova posizione */ .....Mark(Board, Size, Riga-1, IdxBack, -1);//Decremento le pozisioni vecchie .....Soluzione[Riga]=0; .....NQueens(Board, Size, Riga-1, IdxBack+1, TotSolution, Soluzione, IdxBack); ....} ..} } In questo modo ho fatto sì che su ogni riga ci sia solo una Regina e tramite la funzione Mark aggiungo 1 in tutte le celle guardate dall' ultima regina posizionata. Ciò che non riesco a fare e' il Backtraking in modo corretto: Utilizzando lo stack di ricorsione eliminare l' ultima mossa e provare con una nuova mossa. Qualcuno mi potrebbe aiutare? Grazie. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:15.



















