#include <stdio.h>
#include <stdlib.h> 
 
#define NB_DAMES 8
 
int dame_sans_danger(const char *tab, int ligne, int colonne)
{
    int i;
    for (i = 0; i < ligne; ++i)
        if (tab[i] == colonne /* dame sur la m�me colonne */
            || abs(colonne - tab[i]) == ligne - i) /* dame en diagonale */
            return 0;
    return 1;
}
 
void afficher_echiquier(const char *tab)
{
    int i, j;
    for (i = 0; i < NB_DAMES; i++) {
        for (j = 0; j < NB_DAMES; j++)
            if (tab[i] == j)
                printf("X ");
            else
                printf("O ");
        printf("\n");
    }
    printf("\n\n");
}   
 
void ajoute_dame(char *tab, int *nb_solutions, int ligne)
{
	int colonne;
 
	if (ligne == NB_DAMES) {
		afficher_echiquier(tab);
                (*nb_solutions)++;
	} else
            for (colonne = 0; colonne < NB_DAMES; colonne++)
		if (dame_sans_danger(tab, ligne, colonne)) {
                    tab[ligne] = colonne;          
                    ajoute_dame(tab, nb_solutions, ligne + 1);
                    tab[ligne] = -1;
		}
}
 
int main(void)
{
    char tab[NB_DAMES];
    int nb_sol = 0;
 
    ajoute_dame(tab, &nb_sol, 0);
    printf("Les %d reines peuvent se resoudre de %d methodes\n", NB_DAMES, nb_sol);
    return 0;
}