All pastes #502199 Raw Edit

Rems

public c v1 · immutable
·published 2007-05-22 12:10 UTC
rendered paste body
#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;}