int candidats_caches_lignes(Sudoku s) /* Il est plus pratique d'ecrire une fonction de type int plutôt que void pour pouvoir retourner le nombre de candidats caches valides */ { int ligne, colonne, val, cd, j, cpt=0; for(ligne=1;ligne<=9;ligne++) /* Pour chaque ligne */ for(val=1;val<=9;val++) /* Toutes les valeurs possibles de 1 a 9 */ { if((cd=compte_occurence_ligne(s, ligne, val, &colonne))==1) /* Si le candidat n'apparait qu'une seule fois dans la ligne */ { s->grille[(9*(ligne-1)+(colonne-1))].valeur=val; /* On la note car c'est la valeur de la case */ s->grille[(9*(ligne-1)+(colonne-1))].nb_candidats=0; for(j=0;j<9;j++) s->grille[(9*(ligne-1)+(colonne-1))].candidat[j]=0; cpt++; } } return cpt; } int candidats_caches_colonnes(Sudoku s) /* Il est plus pratique d'ecrire une fonction de type int plutôt que void pour pouvoir retourner le nombre de candidats caches valides */ { int ligne, colonne, val, cd, j, cpt=0; for(colonne=1;colonne<=9;colonne++) /* Pour chaque colonne */ for(val=1;val<=9;val++) /* Toutes les valeurs possibles de 1 a 9 */ { if((cd=compte_occurence_colonne(s, colonne, val, &ligne))==1) /* Si le candidat n'apparait qu'une seule fois dans la ligne */ { s->grille[(9*(ligne-1)+(colonne-1))].valeur=val; /* On la note car c'est la valeur de la case */ s->grille[(9*(ligne-1)+(colonne-1))].nb_candidats=0; for(j=0;j<9;j++) s->grille[(9*(ligne-1)+(colonne-1))].candidat[j]=0; cpt++; } } return cpt; } int candidats_caches_regions(Sudoku s) /* Il est plus pratique d'ecrire une fonction de type int plutôt que void pour pouvoir retourner le nombre de candidats caches valides */ { int region, case_sudoku, val, cd, j, cpt=0; for(region=1;region<=9;region++) /* Pour chaque region */ for(val=1;val<=9;val++) /* Toutes les valeurs possibles de 1 a 9 */ { if((cd=compte_occurence_region(s, region, val, &case_sudoku))==1) /* Si le candidat n'apparait qu'une seule fois dans la ligne */ { s->grille[case_sudoku].valeur=val; /* On la note car c'est la valeur de la case */ s->grille[case_sudoku].nb_candidats=0; for(j=0;j<9;j++) s->grille[case_sudoku].candidat[j]=0; cpt++; } } return cpt; } int valide_candidats_caches(Sudoku s) { int cdl=0, cdc=0, cdr=0; /* Si des candidats caches sont valide, il faut reduire a nouveau la liste des candidats pour chaque case*/ cdl=candidats_caches_lignes(s); if(cdl) reduire_candidats(s); cdc=candidats_caches_colonnes(s); if(cdc) reduire_candidats(s); cdr=candidats_caches_regions(s); if(cdr) reduire_candidats(s); return (cdl+cdc+cdr); }