#include "strategie_moyenne.h"void presence_candidat_region(Sudoku s, int c, int val, T_Case *lieux){ /*c est le numéro d'une région*/ int i, j, k, indice, nb_case=0, cases[CAND_MAX]; /* nb_case = nombre de cases où val est candidat cases[] = tableau répertoriant le numéro de cases en question*/ /*parcours de la region*/ for(i=0; i<3; i++) /*pour chaque ligne*/ for(j=0; j<3; j++) /*pour chaque colonne*/ { indice=faible_indice(c)+9*i+j; for(k=0; k<CAND_MAX; k++) /*pour chaque candidat de la case*/ { if(s->grille[indice].candidat[k] == val) /*si val est candidat*/ { /*on le rajoute dans la liste lieux*/ cases[nb_case]=3*i+j; nb_case++; } } } /*affectation des valeurs à lieux*/ lieux->valeur=c; lieux->nb_candidats=nb_case; for(i=0; i<CAND_MAX; i++) lieux->candidat[i]=cases[i];}int distribution_ligne(Sudoku s, T_Case lieux, int val){ int i, j, k, ligne1, ligne2, indice; ligne1=lieux.candidat[0]/3; for(i=0; i<lieux.nb_candidats; i++) /*pour chaque case rescencée*/ { ligne2=lieux.candidat[i]/3;/* à priori inutile : indice=faible_indice(lieux.valeur)+ligne2+lieux.candidat[i]%3;*/ /*chaque case a val comme candidat*/ /*si ligne1 et ligne2 sont différents on ne peut pas simplifier car le candidat est au moins sur 2 lignes*/ if(ligne2!=ligne1) return 3; } return ligne1;}int distribution_colonne(Sudoku s, T_Case lieux, int val){ int i, j, k, colonne1, colonne2, indice; colonne1=lieux.candidat[0]%3; for(i=0; i<lieux.nb_candidats; i++) /*pour chaque case rescencée*/ { colonne2=lieux.candidat[i]%3;/* à priori inutile : indice=faible_indice(lieux.valeur)+ligne2+lieux.candidat[i]%3;*/ /*chaque case a val comme candidat*/ /*si ligne1 et ligne2 sont différents on ne peut pas simplifier car le candidat est au moins sur 2 lignes*/ if(colonne2!=colonne1) return 3; } return colonne1;}void supprime_candidat_bloques_ligne(Sudoku s, int region, int ligne, int val){ int i, indice_depart; indice_depart=ligne; for(i=indice_depart; i<indice_depart+9; i++) if(faible_indice(indice_depart+i) != faible_indice(region)) supprime(s->grille[i].candidat, s->grille[i].nb_candidats, val);}void supprime_candidat_bloques_colonne(Sudoku s, int region, int colonne, int val){ int i, indice_depart; indice_depart=colonne; for(i=indice_depart; i<TAILLE; i+=9) if(faible_indice(indice_depart+i) != faible_indice(region)) supprime(s->grille[i].candidat, s->grille[i].nb_candidats, val);}int enleve_candidats_bloques_region(Sudoku s){ int i, j, val, region, ligne, colonne, cpt=0; T_Case lieux; for(region=0; region<CAND_MAX; region++) /*pour chaque case*/ { for(val=1; val<=CAND_MAX; val++) { presence_candidat_region(s, region, val, &lieux); ligne=distribution_ligne(s, lieux, val); colonne=distribution_colonne(s, lieux, val); /*on a (peut etre) la ligne ou/et la colonne unique de la region ou il y a le candidat*/ if(ligne<3) { supprime_candidat_bloques_ligne(s, region, ligne, val); } if(colonne<3) { supprime_candidat_bloques_colonne(s, region, colonne, val); } } } return 0;}