Accueil > > > SUDOKID, C'EST UN SUDOKU AVEC SEULEMENT 16 CASES.
SUDOKID, C'EST UN SUDOKU AVEC SEULEMENT 16 CASES.
Information sur la source
Description
C'est le célèbre jeu du sudoku, mais avec un peu moins de case (16 cases à la place de 81). - Sudoku1.0.cpp : il permet de creer des grilles pleines. - Sudoku1.1.cpp : il permet de creer des grilles à remplir + leurs solutions.
Source
- #include <iostream>
- #include <vector>
-
- using namespace std;
-
- int getint()
- {
- for(;;)
- {
- int valeur;
- cin >> valeur;
- if(cin.fail())
- {
- cin.clear();
- string inutile;
- getline(cin, inutile);
- cout <<"\nCe n'etait pas un nombre entier, reessayer : \n";
- }
- else
- {
- return valeur;
- }
- }
- }
-
-
- //---------------------------------------------------------------
-
-
- vector <int> sudokid()
- {
- vector <int> grille;
-
- /*erreurligne est là pour refaire la ligne entiere s'il y a un probleme*/
-
- int erreurligne(0);
- for(int i(0); i<16; i++)
- {
-
- /*Attribution d'un nombre "provisoire à la case n°'i'*/
-
- int temp((rand()%4)+1);
-
- /*Voir s'il est possible de mettre ce nombre à cette endroit*/
- /*case (nommée lieu), ligne et colonne sont la pour repérer la case traité ('i') et savoir sur quelle case, ligne et colonne elle se trouve*/
-
- int ligne(0);
- int colonne(0);
- int lieu(0);
-
- /*erreur est là pour vérifier s'il y a des erreurs, s'il y en a alors 'i' restera le même*/
-
- int erreur(0);
-
- /*Recherche de la ligne et de la colonne où se trouve la case 'i'*/
-
- for(int lacolonne(0);lacolonne!=4;lacolonne++)
- {
- for(int laligne(0);laligne!=4;laligne++)
- {
- if(i==(laligne*4)+lacolonne)
- {
- ligne=laligne;
- colonne=lacolonne;
- }
- }
- }
-
- /*Ligne et colonne ont été trouvés*/
- /*Désormais, voir si la valeur donnée à cette case peut aller dans cette ligne et dans cette colonne*/
-
- for(int verif(0);verif!=4;verif++)
- {
- if((verif+(ligne*4))<i&&temp==grille[verif+(ligne*4)]) erreur=1;
- if((verif*4+colonne)<i&&temp==grille[verif*4+colonne]) erreur=1;
- }
-
- /*Vérification de la ligne et de la colonne dont fait partie le point : ACHEVEE*/
- /*Recherche de la case où est situé 'i'*/
-
- for(int x(1);x!=3;x++)
- {
- for(int y(1);y!=3;y++)
- {
- if((colonne<(x*2)&&colonne>(x-1)*2-1)&&(ligne<y*2&&ligne>(x-1)*2-1)) lieu=((x-1)+(y-1)*4)*2;
- }
- }
-
- /*L'ordinateur regarde si le nombre se trouve déjà dans la case*/
- /*La case en haut et celle à gauche ayant déjà été vérifiées, il vérifie la case en haut à gauche ou celle en haut à droite*/
- /*Selon la position de la case 'i'*/
-
- if((i==lieu+5)&&(temp==grille[lieu])) erreur=1;
- if((i==lieu+4)&&(temp==grille[lieu+1])) erreur=1;
-
- /*L'ordinateur regarde si des erreurs ont été révélées*/
- /*Si c'est le cas il baisse 'i' (i--)*/
-
- if(erreur==1)
- {
- erreurligne++;
- if(erreurligne<10) i--;
- else
- {
-
- /*S'il y a 10 erreur sur la meme case*/
- /*Le programme recommence toute la ligne*/
-
- for(int efface(4);efface!=0;--efface)
- {
- if(i>efface+ligne*4) grille.erase(grille.begin()+efface+ligne*4);
- }
- i=ligne*4;
- }
- }
- else
- {
- grille.push_back(temp);
- erreurligne=0;
- }
- }
- return grille;
- }
-
-
- //--------------------------------------------------------------
-
-
- void affichagepleine(vector <int> grillesudokid)
- {
- for(int ligne(0);ligne!=4;++ligne)
- {
- for(int colonne(0);colonne!=4;++colonne)
- {
- if(ligne==2&&colonne==0) cout <<"\n----+----";
- if(colonne==0) cout <<'\n';
- if(colonne==2) cout <<"| ";
- cout <<grillesudokid[ligne*4+colonne]<<" ";
- }
- }
- }
-
-
- //---------------------------------------------------------------
-
-
- void fairegrille(vector <int> grille)
- {
-
- /*L'ordinateur cherche les cases qu'il va afficher*/
-
- int x1(rand()%2);
- int y1(rand()%2);
- int x2=1-x1;
- int y2=1-y1;
- vector <int> casafficher;
- casafficher.push_back(x1+y1*4);
- casafficher.push_back(x1+y1*4+8);
- casafficher.push_back(x2+y2*4+2);
- casafficher.push_back(x2+y2*4+10);
- if(casafficher[1]==8||casafficher[1]==12) casafficher.push_back(casafficher[1]+1);
- else casafficher.push_back(casafficher[1]-1);
-
- /*Puis, il vérifie si la grille est réalisable*/
-
- int nbdifferents(0);
-
- /*Lorsqu'il n'y a que deux nombres différents (a affichés), il y a plusieurs possibilités de résolution*/
- /*c'est pour ceci que j'ai ajouté "nbdifferents" (il compte le nombre de chiffre differents affichés)*/
-
- for(int e(0);e!=2;++e)
- {
- for(int f(2);f!=4;++f)
- {
- if((e!=f)&&(grille[casafficher[e]]==grille[casafficher[f]])) nbdifferents++;
- }
- }
-
- /*Si le nombre de chiffres differents est egal a 2,*/
- /*Ceci signifie que la grille a plusieurs possibilites de resolution*/
- /*Donc, l'ordinateur ajoute d'autres cases*/
- /*Afin, qu'il n'y est plus qu'une possibilite*/
-
- if(nbdifferents==2)
- {
- casafficher.push_back(casafficher[0]+4);
- casafficher.push_back(casafficher[1]+4);
- }
-
- for(int ligne(0);ligne!=4;++ligne)
- {
- for(int colonne(0);colonne!=4;++colonne)
- {
- int existe(0);
- for(int choix(0);choix!=casafficher.size();++choix) if(ligne*4+colonne==casafficher[choix]) ++existe;
- if(ligne==2&&colonne==0) cout <<"\n----+----";
- if(colonne==0) cout <<'\n';
- if(colonne==2) cout <<"| ";
- if(existe!=0) cout <<grille[ligne*4+colonne]<<" ";
- else cout <<"_ ";
- }
- }
- }
-
-
- //---------------------------------------------------------------
-
-
- int main() {
- srand((unsigned) time(NULL));
- vector <int> grillesudokid;
- for(int i(0);i!=2;) {
- cout <<"\n\n\nSUDOKID 1.1";
- cout <<"\n\n1 - Generer une nouvelle grille";
- cout <<"\n2 - Quitter";
- cout <<"\n\nVotre choix : ";
- i=getint();
- if(i==1) {
- grillesudokid=sudokid();
- fairegrille(grillesudokid);
- cout <<"\n\n\nAppuyez sur Entree pour voir la grille resolue\n\n";
- cin.get();
- cin.get();
- affichagepleine(grillesudokid);
- }
- }
- cout <<"\n\n\nCree par Nicolas DUBIEN - 2006";
- cin.get();
- cin.get();
- }
#include <iostream>
#include <vector>
using namespace std;
int getint()
{
for(;;)
{
int valeur;
cin >> valeur;
if(cin.fail())
{
cin.clear();
string inutile;
getline(cin, inutile);
cout <<"\nCe n'etait pas un nombre entier, reessayer : \n";
}
else
{
return valeur;
}
}
}
//---------------------------------------------------------------
vector <int> sudokid()
{
vector <int> grille;
/*erreurligne est là pour refaire la ligne entiere s'il y a un probleme*/
int erreurligne(0);
for(int i(0); i<16; i++)
{
/*Attribution d'un nombre "provisoire à la case n°'i'*/
int temp((rand()%4)+1);
/*Voir s'il est possible de mettre ce nombre à cette endroit*/
/*case (nommée lieu), ligne et colonne sont la pour repérer la case traité ('i') et savoir sur quelle case, ligne et colonne elle se trouve*/
int ligne(0);
int colonne(0);
int lieu(0);
/*erreur est là pour vérifier s'il y a des erreurs, s'il y en a alors 'i' restera le même*/
int erreur(0);
/*Recherche de la ligne et de la colonne où se trouve la case 'i'*/
for(int lacolonne(0);lacolonne!=4;lacolonne++)
{
for(int laligne(0);laligne!=4;laligne++)
{
if(i==(laligne*4)+lacolonne)
{
ligne=laligne;
colonne=lacolonne;
}
}
}
/*Ligne et colonne ont été trouvés*/
/*Désormais, voir si la valeur donnée à cette case peut aller dans cette ligne et dans cette colonne*/
for(int verif(0);verif!=4;verif++)
{
if((verif+(ligne*4))<i&&temp==grille[verif+(ligne*4)]) erreur=1;
if((verif*4+colonne)<i&&temp==grille[verif*4+colonne]) erreur=1;
}
/*Vérification de la ligne et de la colonne dont fait partie le point : ACHEVEE*/
/*Recherche de la case où est situé 'i'*/
for(int x(1);x!=3;x++)
{
for(int y(1);y!=3;y++)
{
if((colonne<(x*2)&&colonne>(x-1)*2-1)&&(ligne<y*2&&ligne>(x-1)*2-1)) lieu=((x-1)+(y-1)*4)*2;
}
}
/*L'ordinateur regarde si le nombre se trouve déjà dans la case*/
/*La case en haut et celle à gauche ayant déjà été vérifiées, il vérifie la case en haut à gauche ou celle en haut à droite*/
/*Selon la position de la case 'i'*/
if((i==lieu+5)&&(temp==grille[lieu])) erreur=1;
if((i==lieu+4)&&(temp==grille[lieu+1])) erreur=1;
/*L'ordinateur regarde si des erreurs ont été révélées*/
/*Si c'est le cas il baisse 'i' (i--)*/
if(erreur==1)
{
erreurligne++;
if(erreurligne<10) i--;
else
{
/*S'il y a 10 erreur sur la meme case*/
/*Le programme recommence toute la ligne*/
for(int efface(4);efface!=0;--efface)
{
if(i>efface+ligne*4) grille.erase(grille.begin()+efface+ligne*4);
}
i=ligne*4;
}
}
else
{
grille.push_back(temp);
erreurligne=0;
}
}
return grille;
}
//--------------------------------------------------------------
void affichagepleine(vector <int> grillesudokid)
{
for(int ligne(0);ligne!=4;++ligne)
{
for(int colonne(0);colonne!=4;++colonne)
{
if(ligne==2&&colonne==0) cout <<"\n----+----";
if(colonne==0) cout <<'\n';
if(colonne==2) cout <<"| ";
cout <<grillesudokid[ligne*4+colonne]<<" ";
}
}
}
//---------------------------------------------------------------
void fairegrille(vector <int> grille)
{
/*L'ordinateur cherche les cases qu'il va afficher*/
int x1(rand()%2);
int y1(rand()%2);
int x2=1-x1;
int y2=1-y1;
vector <int> casafficher;
casafficher.push_back(x1+y1*4);
casafficher.push_back(x1+y1*4+8);
casafficher.push_back(x2+y2*4+2);
casafficher.push_back(x2+y2*4+10);
if(casafficher[1]==8||casafficher[1]==12) casafficher.push_back(casafficher[1]+1);
else casafficher.push_back(casafficher[1]-1);
/*Puis, il vérifie si la grille est réalisable*/
int nbdifferents(0);
/*Lorsqu'il n'y a que deux nombres différents (a affichés), il y a plusieurs possibilités de résolution*/
/*c'est pour ceci que j'ai ajouté "nbdifferents" (il compte le nombre de chiffre differents affichés)*/
for(int e(0);e!=2;++e)
{
for(int f(2);f!=4;++f)
{
if((e!=f)&&(grille[casafficher[e]]==grille[casafficher[f]])) nbdifferents++;
}
}
/*Si le nombre de chiffres differents est egal a 2,*/
/*Ceci signifie que la grille a plusieurs possibilites de resolution*/
/*Donc, l'ordinateur ajoute d'autres cases*/
/*Afin, qu'il n'y est plus qu'une possibilite*/
if(nbdifferents==2)
{
casafficher.push_back(casafficher[0]+4);
casafficher.push_back(casafficher[1]+4);
}
for(int ligne(0);ligne!=4;++ligne)
{
for(int colonne(0);colonne!=4;++colonne)
{
int existe(0);
for(int choix(0);choix!=casafficher.size();++choix) if(ligne*4+colonne==casafficher[choix]) ++existe;
if(ligne==2&&colonne==0) cout <<"\n----+----";
if(colonne==0) cout <<'\n';
if(colonne==2) cout <<"| ";
if(existe!=0) cout <<grille[ligne*4+colonne]<<" ";
else cout <<"_ ";
}
}
}
//---------------------------------------------------------------
int main() {
srand((unsigned) time(NULL));
vector <int> grillesudokid;
for(int i(0);i!=2;) {
cout <<"\n\n\nSUDOKID 1.1";
cout <<"\n\n1 - Generer une nouvelle grille";
cout <<"\n2 - Quitter";
cout <<"\n\nVotre choix : ";
i=getint();
if(i==1) {
grillesudokid=sudokid();
fairegrille(grillesudokid);
cout <<"\n\n\nAppuyez sur Entree pour voir la grille resolue\n\n";
cin.get();
cin.get();
affichagepleine(grillesudokid);
}
}
cout <<"\n\n\nCree par Nicolas DUBIEN - 2006";
cin.get();
cin.get();
}
Conclusion
Merci de me signaler tout probleme. ET SURTOUT, AMUSEZ-VOUS BIEN !
Historique
- 22 juin 2006 17:09:22 :
- Creation de grilles prêtes à remplir (+ de leur solution)
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
un chemin sur une grille [ par anzelus ]
salut à tous,je bloque sur un probleme d'affichage d'une route sur une grille, j'ai reussi à dessiner la grille avec des cases pleines ou vides, mais
Sudoku [ par MasterShadows ]
Bonjour à tous et à toutes,alors voilà, je dois coder en C pour Linux un petit programme permettant de générer une grille de
Projet d'été sur SUDOKU!! Aidez-nous s'il vous plait... [ par Naruttibayo ]
Au préalable, nous tenons à remercier tous ceux qui contribuerons à notre projet...On nous demande d'écrire un programme C qui permet de Générer des G
Probleme avec un sudoku [ par thomasvd ]
Bonjour!je dois réaliser un jeu sudoku et je rencontre quelques problemes dont un qui m'embette particulierement et j'aimerais bien que quelqu'un m'or
sudoku HELP [ par Hellboy67 ]
Voila j'essaie de faire un prog qui remplie les cases d'un sudokuj'ai ma fonction candidats qui me renvoie une file contenant tout les candidats possi
aide pour un code [ par Hellboy67 ]
pour un exo de l'iut en prog je dois faire un sudoku ma fonction solution marche mais lorsque pour un sudoku donnée, il n'y a pas de solution j'a
Probleme avec backtracking [ par sda2 ]
Bonsoir à tous, Je vous expose vite mon probleme, je souhaite realiser un sudoku (9x9), cependant il ne resoud que les sudokus facile, moyen et lui re
Probleme backtracking [ par sda2 ]
Bonsoir à tous, Je vous expose vite mon probleme, je souhaite realiser un sudoku (9x9), cependant il ne resoud que les sudokus facile, moyen et lui r
Interface d'un sudoku sous Gtkmm [ par Jedi_Yoda ]
Je cherche a faire afficher dans les 81 labels le "int" resolu qui lui correpond. Mais le set_label(param) n'accepte que les parametres de types "ustr
Creer un label multiligne ressource [ par sebastienmz ]
Bonjour Voila mon code qui est dans mon fichier .rc: LTEXT "salu\n sava",IDC_LBLDES,7,7,80,80,SS_CENTERIMAGE, WS_EX_CLIE
|
Derniers Blogs
L'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIESL'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIES par odewit
La tendance est aux interfaces naturelles (NUI), et le keynote de Bill Buxton au MIX l'a bien souligné.
La charte graphique et ergonomique de Windows Phone 7 a donc été entièrement repensée en vue d'obtenir un maximum d'efficacité sur ce point. En re...
Cliquez pour lire la suite de l'article par odewit COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson
Forum
TRADAIONTRADAION par shootangel
Cliquez pour lire la suite par shootangel
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|