Le que les chiffres dans les chiffres et les lettres

Soyez le premier à donner votre avis sur cette source.

Vue 4 359 fois - Téléchargée 229 fois

Description

Il résout la partie chiffres des chiffres et des lettres!
Dequoi épater votre grand-mère pendant son émission préférée.
Il fait toutes les opérations possibles jusqu'à ce qu'il trouve le compte donc, algorithmiquement parlant, c'est pas une prouesse et il rame un peu sur les proc les plus lents.
Input: 7 entiers (le nbre à atteindre puis les 6 nbres donnés).
Au fait, c'est du C

Source / Exemple :


#include <stdio.h>
#define NB_VAR 6

int best_res = 0;
int objectif;
int nb_coups = 0;
struct sol 
{
  int val1;
  int val2;
  char op;
  int res;
} solution[NB_VAR - 1];
struct datas
{
  int value;
  int pris;
} jeu[2 * NB_VAR - 1] = {0};
struct datas final_game[2 * NB_VAR - 1] = {0};

int abs(int x)
{
  if (x < 0) return -x;
  else return x;
}

void copie(struct sol dest[NB_VAR - 1], struct sol source[NB_VAR - 1])
{
  int i;
  for (i = 0; i < NB_VAR - 1; i++)
    dest[i] = source[i];
}

void solve(struct sol game[NB_VAR - 1], int tour, int res)
{
  int i, j;

  if (res < 0 || best_res == objectif) return;

  if (abs(res - objectif) < abs(best_res - objectif))
    {
      best_res = res;
      nb_coups = tour;
      copie(solution, game);
      for (i = 0; i < 2 * NB_VAR - 1; i++) final_game[i].value = jeu[i].value;
    }

  for(i = 0; i < NB_VAR + tour; i++)
    {
      if (jeu[i].pris) continue;
      jeu[i].pris = 1;
      for (j = i+1; j < NB_VAR + tour; j++)
	{
	  if (jeu[j].pris) continue;
	  jeu[j].pris = 1;

	  game[tour].val1 = jeu[i].value;
	  game[tour].val2 = jeu[j].value;

	  game[tour].op = '+';
	  game[tour].res = res = jeu[NB_VAR + tour].value = game[tour].val1 + game[tour].val2;
	  solve(game, tour+1, res);

	  game[tour].op = '-';
	  game[tour].res = res = jeu[NB_VAR + tour].value = game[tour].val1 - game[tour].val2;
	  solve(game, tour+1, res);

	  game[tour].op = '*';
	  game[tour].res = res = jeu[NB_VAR + tour].value = game[tour].val1 * game[tour].val2;
	  solve(game, tour+1, res);

	  if (game[tour].val2 != 0 && game[tour].val1 % game[tour].val2 == 0)
	    {
	      game[tour].op = '/';
	      game[tour].res = res = jeu[NB_VAR + tour].value = game[tour].val1 / game[tour].val2;
	      solve(game, tour+1, res);
	    }

	  game[tour].val1 = jeu[j].value;
	  game[tour].val2 = jeu[i].value;

	  game[tour].op = '-';
	  game[tour].res = res = jeu[NB_VAR + tour].value = game[tour].val1 - game[tour].val2;
	  solve(game, tour+1, res);

	  if (game[tour].val2 != 0 && game[tour].val1 % game[tour].val2 == 0)
	    {
	      game[tour].op = '/';
	      game[tour].res = res = jeu[NB_VAR + tour].value = game[tour].val1 / game[tour].val2;
	      solve(game, tour+1, res);
	    }

	  jeu[j].pris = 0;
	}
      jeu[i].pris = 0;
    }
}

int cherche_in_final(int num)
{
  int i = 0;
  while((final_game[i].pris || final_game[i].value != num) && i < 2 * NB_VAR - 1) i++;
  return i;
}

void affiche_coup(int coup)
{
  int a;
  
  final_game[NB_VAR + coup].pris = 1;
  a = cherche_in_final(solution[coup].val1);
  final_game[a].pris = 1;
  if (a >= NB_VAR) affiche_coup(a - NB_VAR);

  a = cherche_in_final(solution[coup].val2);
  final_game[a].pris = 1;
  if (a >= NB_VAR) affiche_coup(a - NB_VAR);

  switch(solution[coup].op)
	{
	case '+' :  jeu[ NB_VAR + coup ].value =  solution[coup].val1 + solution[coup].val1; break;
	case '-' :  jeu[ NB_VAR + coup ].value =  solution[coup].val1 - solution[coup].val2; break;
	case '*' :  jeu[ NB_VAR + coup ].value =  solution[coup].val1 * solution[coup].val2; break;
	case '/' :  jeu[ NB_VAR + coup ].value =  solution[coup].val1 / solution[coup].val2; break;
	}

      printf("%d %c %d = %d\n", solution[coup].val1, solution[coup].op, solution[coup].val2, solution[coup].res);
}
  

int main(int argc, int **argv)
{
  int i, j;
  struct sol truc[NB_VAR - 1] = {0};
  scanf("%d", &objectif);
  for (i = 0; i < NB_VAR; i++)
      scanf("%d", &jeu[i].value);
  for (i = 0; i < 2 * NB_VAR - 1; i++)
    {
      jeu[i].pris = 0;
      final_game[i].pris = 0;
    }
  
  solve(truc, 0, 0);
  printf("\nres: %d\n", best_res);

  for(i = 0; i < NB_VAR; i++) jeu[i].pris = 0;

  affiche_coup(nb_coups - 1);

  printf("\n");
  return 0;
}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
samedi 7 juin 2008
Statut
Membre
Dernière intervention
2 janvier 2010

Bonjour,
je vois que le code date un peu mais bon...
J'essaie de le lancer avec wxDEV-C++ mais il ne marche pas... Est-ce normal ?
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

http://www.cppfrance.com/code.aspx?ID=23621
ma version de l'algo, dispo ici ;-) (trouvais dommage que personne le vois (*tête d'ange*))
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Tu devrais trouver la partie Lettres soit dans mes sources, soit dans celles de aardman avec qui j'avais deja fait cette partie Lettres.
Messages postés
10
Date d'inscription
samedi 5 juin 2004
Statut
Membre
Dernière intervention
27 juillet 2004

BruNews, assez sympa ton interface graphique...
Sinon, merci pour vos commentaires, c'est motivant pour la première source que je publie.
Quand même, on a beau dire, mais LES CHIFFRES ET LES LETTRES, ca restera toujours à la mode :-)

Au fait, si quelqu'un connait un dictionnaire en mode text, qu'il me le fasse savoir, j'ai une ébauche de la partie lettres...
Messages postés
43
Date d'inscription
mardi 30 mars 2004
Statut
Membre
Dernière intervention
7 octobre 2006

lé bien cet algo ;)
on pourrai faire un concours à savoir celui qui optimise au maximum ce genre d'algo ;) (d'un point de vue algorythmique c tres interessant et stimulant)

pour ce qui est de PROLOG, je l'avais deja fait. c pa la premiere fois que je vois ce sujet :p. donc j'ai juste ressorti celui que j'avais sorti la derniere fois.
pour ceux qui voudraient apprendre le PROLOG je donne le lien de mes cours à la fac : http://www710.univ-lyon1.fr/~nducloss/Prolog/index.html
ce qui est interessant c que PROLOG ne possede que tres peu de mots propre (a lui meme) et donc s'apprend extrement vite (bcp plus vite que le c par exemple, en une soirée normalement on sait deja faire presque tout :p) et c un langage qui permet de bien comprendre les techniques de récursivité (PROLOG ne marche qu'en récursivité) et les techniques d'IAs ;)

sympas l'interface graphique ;)
je l'aurai bien fait sous QT mais bon fau dl la librairie pour ceux qui sont sous windows (QT est portable)
Afficher les 34 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (mickaeliazerty)