LarsSalazar
27-10-2008, 13:12
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.
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.