Le que les chiffres dans les chiffres et les lettres

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

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)