Sudoku - le programme !

Discutez d'informatique ici !
Patastronch
Membre Irrationnel
Messages: 1345
Enregistré le: 23 Aoû 2005, 00:53

par Patastronch » 26 Déc 2007, 12:02

Qu'est ce qu'il faut pas entendre :triste:



_-Gaara-_
Membre Complexe
Messages: 2813
Enregistré le: 03 Nov 2007, 15:34

par _-Gaara-_ » 26 Déc 2007, 12:05

Patastronch a écrit:Qu'est ce qu'il faut pas entendre :triste:


:hein: .


lire plutôt :D :happy2:

je rigoooooooLe

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 13:00

par lapras » 26 Déc 2007, 13:12

quelqun saurait comment éviter l'erreur : excess elements
pour cette ligne :
char grilleDepart={8,4,7,0,9,0,2,0,0,3,0,0,0,0,2,0,0,7,9,0,0,7,0,0,6,0,0,0,0,3,0,0,0,8,2,6,2,0,0,0,6,1,5,4,9,0,5,0,0,8,9,0,0,1,4,0,6,9,2,0,0,8,5,0,0,0,1,7,0,9,0,0,0,8,0,5,4,6,1,0,2};

??

Anna68
Membre Naturel
Messages: 42
Enregistré le: 22 Oct 2007, 13:01

par Anna68 » 26 Déc 2007, 13:21

Tu veux dire, qu'on doit faire un programme qui efface des occurrences :briques: :hein: :marteau:

Flodelarab
Membre Légendaire
Messages: 6574
Enregistré le: 29 Juil 2006, 15:04

par Flodelarab » 26 Déc 2007, 13:33

lapras a écrit:quelqun saurait comment éviter l'erreur : excess elements
pour cette ligne :
char grilleDepart={8,4,7,0,9,0,2,0,0,3,0,0,0,0,2,0,0,7,9,0,0,7,0,0,6,0,0,0,0,3,0,0,0,8,2,6,2,0,0,0,6,1,5,4,9,0,5,0,0,8,9,0,0,1,4,0,6,9,2,0,0,8,5,0,0,0,1,7,0,9,0,0,0,8,0,5,4,6,1,0,2};

??

HUM! Rentre au moins la taille de ton tableau. Tu déclares UN caractère et tu lui en balances 81 ......


Voilà un code qui marche:

Code: Tout sélectionner
#include


int main ()
{
char grilleDepart[81]={8,4,7,0,9,0,2,0,0,3,0,0,0,0,2,0,0,7, 9,0,0,7,0,0,6,0,0,0,0,3,0,0,0,8,2,6,2,0,0,0,6,1,5, 4,9,0,5,0,0,8,9,0,0,1,4,0,6,9,2,0,0,8,5,0,0,0,1,7, 0,9,0,0,0,8,0,5,4,6,1,0,2};

 std::cout<<char(grilleDepart[4]+48)<<"\n";

  return 0;
}

Avatar de l’utilisateur
raito123
Habitué(e)
Messages: 2102
Enregistré le: 04 Nov 2007, 03:29

par raito123 » 26 Déc 2007, 13:35

Bonjours,

c'est avec quel programme on fait cela??
Les multiples ne doivent pas être utilisés sans nécessité

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 13:00

par lapras » 26 Déc 2007, 13:45

Oula ou avais je la tete !
j'ai oublié de bien initialiser le tableau !
merci flodelarab

Raito : tu fais cela avec DevC++ il faut coder en C ou C++ (moi en l'occurence c'est en C !)

Flodelarab
Membre Légendaire
Messages: 6574
Enregistré le: 29 Juil 2006, 15:04

par Flodelarab » 26 Déc 2007, 13:57

lapras a écrit:Oula ou avais je la tete !
j'ai oublié de bien initialiser le tableau !
merci flodelarab

Raito : tu fais cela avec DevC++ il faut coder en C ou C++ (moi en l'occurence c'est en C !)

HIHI. Moi c'est en C++

gol_di_grosso
Membre Irrationnel
Messages: 1402
Enregistré le: 22 Sep 2007, 12:28

par gol_di_grosso » 27 Déc 2007, 16:33

On a justement fais un sudoku en c au premier semestre de L1. Et on c'etait demandé comment on pourrait généré des grille, y en pas qui saurait ?

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 13:00

par lapras » 27 Déc 2007, 16:44

salut,
jai fini le programme, il marche super, il est tres court et performant :)
Je sens que je vais m'amuser avec les sudoku !
Pour générer une grille , qu'entends tu par la ?
générer un énoncé ?
Ou un sudoku au hasard avec la solutioN ?

Flodelarab
Membre Légendaire
Messages: 6574
Enregistré le: 29 Juil 2006, 15:04

par Flodelarab » 27 Déc 2007, 17:29

gol_di_grosso a écrit:On a justement fais un sudoku en c au premier semestre de L1. Et on c'etait demandé comment on pourrait généré des grille, y en pas qui saurait ?

A part en partant d'une grille pleine et en faisant une moulinette de suppression des chiffres inutiles, je ne vois pas.

Mais c'est assez compliqué de faire un générateur. Je n'ai toujours pas trouver comment faire un générateur de Slitherlink.

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 13:00

par lapras » 27 Déc 2007, 17:33

Flodelarab > Es ce que ton programme arrive a résoudre cette grille :
char sudoku[81]={0,0,1,0,0,0,7,0,0,8,0,0,0,0,5,0,0,0,0,9,5,8,0,0,4,1,0,0,3,8,0,0,6,0,0,0,0,0,0,9,0,8,0,0,0,0,0,0,2,0,0,8,3,0,0,1,3,0,0,9,5,7,0,0,0,0,6,0,0,0,0,9,0,0,7,0,0,0,3,0,0};

Flodelarab
Membre Légendaire
Messages: 6574
Enregistré le: 29 Juil 2006, 15:04

par Flodelarab » 27 Déc 2007, 18:31

0 0 1 0 0 0 7 0 0
8 0 0 0 0 5 0 0 0
0 9 5 8 0 0 4 1 0
0 3 8 0 0 6 0 0 0
0 0 0 9 0 8 0 0 0
0 0 0 2 0 0 8 3 0
0 1 3 0 0 9 5 7 0
0 0 0 6 0 0 0 0 9
0 0 7 0 0 0 3 0 0

4 6 1 3 9 2 7 8 5
8 7 2 1 4 5 6 9 3
3 9 5 8 6 7 4 1 2
2 3 8 7 5 6 9 4 1
1 4 6 9 3 8 2 5 7
7 5 9 2 1 4 8 3 6
6 1 3 4 2 9 5 7 8
5 8 4 6 7 3 1 2 9
9 2 7 5 8 1 3 6 4

Voulez-vous une autre solution ? (o/N)
o
Pas de nouvelle solution.

gol_di_grosso
Membre Irrationnel
Messages: 1402
Enregistré le: 22 Sep 2007, 12:28

par gol_di_grosso » 27 Déc 2007, 19:10

lapras a écrit:Pour générer une grille , qu'entends tu par la ?
générer un énoncé ?
Ou un sudoku au hasard avec la solutioN ?

généré une grille à remplir, oui un énoncé.

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 13:00

par lapras » 27 Déc 2007, 19:33

Flo, puis je avoir un ordre de grandeur du temps que ton programme a mis pour trouver la solution ?

Flodelarab
Membre Légendaire
Messages: 6574
Enregistré le: 29 Juil 2006, 15:04

par Flodelarab » 27 Déc 2007, 19:47

lapras a écrit:Flo, puis je avoir un ordre de grandeur du temps que ton programme a mis pour trouver la solution ?

réponse de la commande "time":
0.06user 0.00system 0:04.11elapsed 1%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (2major+281minor)pagefaults 0swaps

:lol: en français, je dirais "instantanément"

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 13:00

par lapras » 27 Déc 2007, 19:56

Franchement pas mal !
Moi mon prgm galere, puisqu'il teste pas mal de possibilités, et qu'il y'en a un paquet à tester !

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 13:00

par lapras » 27 Déc 2007, 20:27

Voici mon code (attention, c'est peut être mal codé j'ai pas l'habitude...) :


Code: Tout sélectionner
#include
#include
#include
//mettre un 'A' pour les cases vide dans Grille depart et un '0' dans les case vide dans Sudoku.

char grilleDepart[81]={'A',3,'A',2,'A','A','A','A','A','A','A','A',4,5,8,'A','A','A',4,'A','A','A',6,3,7,'A',5,'A',9,'A','A','A','A',3,8,'A',1,'A','A','A',2,'A','A','A',6,'A',5,7,'A','A','A','A',4,'A',6,'A',4,9,3,'A','A','A',7,'A','A','A',6,8,5,'A','A','A','A','A','A','A','A',2,'A',9,'A'};
char sudoku[81]={0,3,0,2,0,0,0,0,0,0,0,0,4,5,8,0,0,0,4,0,0,0,6,3,7,0,5,0,9,0,0,0,0,3,8,0,1,0,0,0,2,0,0,0,6,0,5,7,0,0,0,0,4,0,6,0,4,9,3,0,0,0,7,0,0,0,6,8,5,0,0,0,0,0,0,0,0,2,0,9,0};
char i[81]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //Chiffre a la profondeur [profondeur]
char j[81]= {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; //Indique si on doit avancer dans la récursivité ou reculer

void ajouterCase(int profondeur); //programme principal récursif
int isValid(char *sudoku); //verifie la validité du sudoku et affiche la grille
int in_array(int numeroCase); //Verfie si une case n'est pas déja définie dans la grille
void reculer(int profondeur); // modifie j
void avancer(int profondeur);

Code: Tout sélectionner
int main(int argc, char *argv[])
{
   
  ajouterCase(0);
  system("PAUSE");   
  return 0;
}

Code: Tout sélectionner
void ajouterCase(int profondeur)
{

     if(profondeur==80 && isValid(sudoku)) // si on est a la derniere case, et que la grille est valide, c'est fini !
     {
                       printf("FINI , solution : \n");
                       isValid(sudoku);
                       system("PAUSE");
                       exit(0);
     }
     if(in_array(profondeur)) //si la case est prédéfinie par l'énoncé
     {
                             if(j[profondeur]==1) //si on est autorisé a avancer dans la récursivité
                             {
                                                 ajouterCase(profondeur+1); //on appelle la fonction a la profondeur + 1
                             }
                             else
                             {
                                 ajouterCase(profondeur-1); //sinon on recule dans la récursivité
                             }
     }
     else //sinon on est devant une case vide (une case = 0)
     {
                             
     while(i[profondeur]<=8) //tant que le chiffre de la case n° profondeur est <= 9
     {
                            i[profondeur]++;
                            sudoku[profondeur]=i[profondeur];
                            if(isValid(sudoku))
                            {
                                               avancer(profondeur); //On active les j pour pouvoir avancer dans la récursivité
                                               ajouterCase(profondeur+1);
                            }
     }
     reculer(profondeur);//On desactive les j pour pouvoir reculer dans les cases du sudoku (c'est a dire les j[0] à j[profondeur-1] sont mis a 0)
     i[profondeur]=0; //On remet a 0 la case puisqu'aucun numéro ne marche
     sudoku[profondeur]=0; //On efface la case
     ajouterCase(profondeur-1); //on remonte à la profondeur - 1
     }
}

Flodelarab
Membre Légendaire
Messages: 6574
Enregistré le: 29 Juil 2006, 15:04

par Flodelarab » 27 Déc 2007, 20:47

S'il devait y avoir une faute, LA faute serait de faire une fonction isValide.
Tu la fais à tous les tours. Elle doit tester entièrement ta grille à chaque fois alors que tu sais pertinemment que tu ne changes qu'un élément à chaque tour.

La récursivité est maladroite et inadéquate. Tu ne tires pas profit de la simplification du code.

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 13:00

par lapras » 27 Déc 2007, 20:53

Effectivement je suis allé trop à la bourrin la dessus !
Je modifie et je regarde la différence de vitesse, je pense que ca va se voir !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite