#include <stdio.h>
#define N 8
/*Questo programma cerca tramite la tecnica di backtracking la soluzione
* al problema delle 8 regine (Inserire in una scacchiera 8x8, 8 regine
* senza che si mangino tra loro. Le regine possono muoversi in diagonale,
* lungo la verticale e l'orizzontale di n caselle).
* Written By Matrix86
*/
void stampa(int mat[N][N]){
//Funzione che stampa a video la matrice
int i,j;
for(i=0;i < N;i++){
for(j=0;j < N;j++){
if(mat [i ][j ] == 1) printf("R ");
else if (mat [i ][j ] == 0) printf(". ");
}
}
}
int prova (int mat[N][N], int queen){
/*Backtracking*/
int i;
if (queen >= N) return 1;
for (i = 0; i < N; i++){
if (verificaMat(mat,queen,i)) mat[queen][i]=1;
else continue;
if (prova(mat,queen+1)) return 1;
mat[queen][i]=0;
}
return 0;
}
int verificaMat(int mat[N][N],int riga,int colonna){
//Funzione che testa se la combinazione č giusta
int i;
//Testo se ci sono pių regine sulla stessa riga
for (i = 0; i < N; i++) if (mat[riga][i] && i != colonna) return 0;
//Testo se ci sono pių regine sulla stessa colonna
for (i = 0; i < N; i++) if (mat[i][colonna] && i != riga) return 0;
//Testo la diagonale destra
if(!controllaDiagNumDx(mat,riga,colonna)) return 0;
//Cerco una regina e vedo lungo la diagonale sinistra
if(!controllaDiagNumSx(mat,riga,colonna)) return 0;
return 1;
}
int controllaDiagNumDx(int matrix[N][N],int x,int y){
//Controlla la diagonale che parte da SX e scende a DX
int i = x,j = y;
while((i > 0) && (j > 0)){
i--;
j--;
if(matrix[i][j] == 1) return 0;
}
i = x;
j = y;
while((i < N) && (j < N)){
i++;
j++;
if(matrix[i][j] == 1) return 0;
}
//Controllo passato!
return 1;
}
int controllaDiagNumSx(int matrix[N][N],int x,int y){
//Controlla la diagonale che parte da DX e scende a SX
int i = x,j = y;
while((i > 0) && (j < N)){
i--;
j++;
if(matrix[i][j] == 1) return 0;
}
i = x;
j = y;
while((i < N) && (j > 0)){
i++;
j--;
if(matrix[i][j] == 1) return 0;
}
//Controllo passato!
return 1;
}
int main(int argc,char *argv[]){
//Creo una matrice vuota...
int mat[N][N] = { 0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0 };
fprintf(stdout,"Soluzione del problema delle 8 regine:\n");
//Se esiste la soluzione stampamela a video...
if(prova(mat,0)) stampa(mat);
exit(0);
}
|