コード例 #1
0
ファイル: autre copie de laby.c プロジェクト: Owaa/Doom-Like
void propage(int x , int y , int val, int dir){
    printf(" -------- %d %d \n\n", x , y   );

  //gauche
  if(dir!= 4 &&  x -2 >0 && laby[x-2][y] == val){
    

    laby[x -1][y] =  laby[x][y];
    laby[x -2][y] = laby[x][y];
    //    nb_point_laby--;

    propage(x-2,y  ,val,2);

  }

  // droite
  if (dir!= 2 &&  x+2 < MT-1 && laby[x+2][y] == val){
    
    laby[x +1][y] = laby[x][y];
    laby[x +2][y] = laby[x][y];
    //  nb_point_laby--;

    propage(x+2,y  ,val , 4);

  }

  //haut

  if (dir!= 1 &&  y-2 >0 &&laby[x][y-2] == val){
    
    laby[x][y - 1] = laby[x][y];
    laby[x][y - 2] = laby[x][y];
    // nb_point_laby--;

    propage(x,y-2,val, 3);

  }
  
  
  //bas

  

  if (dir!= 3 && y+2 < MT-1 && laby[x][y+2] == val){
    
    laby[x][y + 1] = laby[x][y];
    laby[x][y + 2] = laby[x][y];
    //  nb_point_laby--;

    propage(x,y+2,val,1);

  }
  else return;
}
コード例 #2
0
ファイル: Solveur.cpp プロジェクト: prShadoko/SAT
/**
 * Détermine si l'une des clauses de la formule est insatisfaite selon une interprétation donnée et effectue la propagation des valeurs qui peuvent être déduites.
 * Si la valeur de vérité de l'une des clauses est indéterminée et que la valeur d'une seule variable n'est pas définie, elle est définie à VRAI.
 * @param id_var La variable dont on veut tester si elle rend la formule insatisfiable.
 * @param interpretation L'interprétation selon laquelle les clauses seront évaluées.
 * @param index L'index des clauses de la formule.
 * @param deduites La liste des variables dont la valeur est déduite des précédentes affectations.
 * @return VRAI si l'une des clauses n'est pas satisfiable avec l'interprétation donnée. FAUX sinon.
 * @see indexeClauses(forme_conjonctive&)
 * @see contientInsatisfaite(const unsigned int, const short int*, const index_clauses&)
 * @see cherche4(const forme_conjonctive&, short int *, const unsigned int, const index_clauses&, const unsigned int)
 */
bool propage(const unsigned int id_var, short int *interpretation, const index_clauses &index, vector<unsigned int> &deduites) {
	unsigned int indice = id_var - 1;
	int litt_var_suiv = 0;
	short int clause_satisfaite;
	map< unsigned int, vector<clause*> >::const_iterator it_clauses;
	vector<clause*> clauses;

	if(interpretation[indice] == 0) {
		return false;
	}

	if(interpretation[indice] > 0) {
		if((it_clauses = index.neg.find(id_var)) == index.neg.end()) {
			return false;
		}
	} else {
		if((it_clauses = index.pos.find(id_var)) == index.pos.end()) {
			return false;
		}
	}
	clauses = it_clauses->second;

	for(vector<clause*>::const_iterator it=it_clauses->second.begin(); it!=it_clauses->second.end(); it++) {
		clause_satisfaite = clause_est_satisfaite((**it), interpretation);
		if(clause_satisfaite == -1) { // clause insatisfaite
			return true;
		} else if(clause_satisfaite == 0) { // clause indeterminée
			for(vector<int>::iterator it_litt=(*it)->begin(); it_litt!=(*it)->end(); it_litt++) {
				if(interpretation[abs(*it_litt)-1] == 0) {
					if(litt_var_suiv == 0) { // 1° variable indéterminée
						litt_var_suiv = *it_litt;
					} else { // 2° variable indéterminée -> pas de propagation possible
						litt_var_suiv = 0;
						break;
					}
				}
			}
		}

		if(litt_var_suiv != 0) { // propagation
			unsigned int id_var_suiv = abs(litt_var_suiv);
			deduites.push_back(id_var_suiv);
			interpretation[id_var_suiv-1] = litt_var_suiv / id_var_suiv;
			propage(id_var_suiv, interpretation, index, deduites);
		}
	}

	return false;
}
コード例 #3
0
ファイル: Solveur.cpp プロジェクト: prShadoko/SAT
/**
 * Cherche une interprétation pour laquelle la forme conjonctive est satisfaite.
 * S'appelle récursivement pour tester les interprétations possibles.
 * Si l'affectation d'une valeur à une variable rend la formule insatisfiable, toutes les interprétations utilisant cette affectation sont ignorées.
 * Si la fonction retourne VRAI, le paramètre interprétation contient l'interprétation satisfaisant la forme conjonctive.
 * @param fc La forme conjonctive à évaluer.
 * @param interpretation L'interprétation courante.
 * @param nb_var Le nombre de variables de la formule.
 * @param index L'index des clauses selon les littéraux qu'elles contiennent.
 * @param id_var Le numéro de la variable en cours de traitement. Ce paramètre DOIT ÊTRE OMIS ou mis à sa valeur par défaut : 1.
 * @return VRAI si la forme conjonctive est satisfiable. FAUX sinon.
 * @see cherche1(const forme_conjonctive&, short int*, const unsigned int, const unsigned int)
 * @see cherche2(const forme_conjonctive&, short int*, const unsigned int, const unsigned int)
 * @see cherche3(const forme_conjonctive&, short int *, const unsigned int, const index_clauses&, const unsigned int)
 */
bool cherche4(const forme_conjonctive &fc, short int *interpretation, const unsigned int nb_var, const index_clauses &index, const unsigned int id_var) {
	const int indice = id_var - 1;
	vector<unsigned int> deduites;
	for(interpretation[indice]=1; interpretation[indice]>=-1; interpretation[indice] -= 2) { // 1,-1
		if(!propage(id_var, interpretation, index, deduites)) {
			if(id_var < nb_var) { // S'il reste des variables indéfinies
				if(cherche4(fc, interpretation, nb_var, index, id_var + 1)) {
					return true;
				}
			} else {
				return true;
			}
		}
	}

	for(vector<unsigned int>::iterator it_ded=deduites.begin(); it_ded!=deduites.end(); it_ded++) {
		interpretation[(*it_ded)-1] = 0;
	}
	return false;

}
コード例 #4
0
ファイル: autre copie de laby.c プロジェクト: Owaa/Doom-Like
void creat_laby(void){
  int x , y ;
  int h =0, v=0 ,old_value = 0 , ob, direction = 0;;
 
  int  nb_point_laby = M*M;
   while (    nb_point_laby !=1){

  x = (rand()% 5 ) *2 +1 ;
  y = (rand()% 5 ) *2 +1 ;
 

  ob = rand()%  2;

  if(ob ==0)
    h =  (rand()%2)*2 -1;
  else
    v =  (rand()%2)*2 -1;

  if(h ==-1) direction = 4;
  if(h == 1) direction = 2;

  
  if( x+ h*2 > MT-1 ||x+ h*2< 0 ||  y+ v*2 > MT-1 ||  y+ v*2< 0 )continue ;
  
  if(h ==-1) direction = 4;
  else if(h == 1) direction = 2;
  if(v ==-1) direction = 1;
  else if(v == 1) direction = 3;
  
  
  if( laby[x][y] == laby[x + h*2][y + v*2] ){printf("  %d    %d\n",laby[x][y],  laby[x + h*2][y + v*2]   );  continue;} 
 
 
 
  
  if( laby[x][y] < laby[x + h*2][y + v*2] ){
    printf("ENtre dans le test plsu petir\n\n"  );

    
    laby[x][y] = laby[x + h*2][y + v*2];
    laby[x+h][y+v] = laby[x + h*2][y + v*2];
    nb_point_laby--;
     continue;

  
    // return;
  }
  printf("Apres le Ir hor = %d   , vert = %d  \n\n" , h , v   );


  old_value =laby[x + h*2][y + v*2] ;
  printf("oldvalue %d  x = %d  y = %d \n\n",old_value , x + h*2 ,y + v*2   );

  laby[x + h][y + v] = laby[x][y] ;//laby[x][y];
  laby[x + h*2][y + v*2] =  laby[x][y];//laby[x][y];
  nb_point_laby--;

    printf("ENtre dans Propage \n\n"  );

    propage(x + h* 2,y + v*2 ,old_value , direction);
    printf("Sort de Propage \n\n"  );

  
   }



   
    //   printf("",old_value ,  laby[x + h*2][y + v*2]   );

}