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
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|