[sudoku] Résolution d'une grille 9*9 en java

Fermé
80chris Messages postés 18 Date d'inscription samedi 1 mai 2010 Statut Membre Dernière intervention 17 novembre 2012 - 1 mai 2010 à 17:05
80chris Messages postés 18 Date d'inscription samedi 1 mai 2010 Statut Membre Dernière intervention 17 novembre 2012 - 2 mai 2010 à 03:14
Bonjour a tous , je m'appelle christopher et je suis en 1er année d'informatique à Amiens , on a un projet à faire qui est de faire un programme qui résout une grille de sudoku 9*9 .
Le code est quasiment bon , l'ensemble des cases se remplissent mais il arrive sur certaines qu'elles contiennent un nombre plus grand que 9 ( 10 , 11 ou 12 ) . Et je n' arrive pas a déterminer la cause du problème et le projet est a rendre pour Mardi , si vous pourriez me donner un coup de main , ça serait vraiment sympa .

L'affichage de la grille est donné par les enseignants , il contient des valeurs initiales , et le 0 permet de coder une case vide .


Si vous avez besoin de plus d'information , n'hésitez pas

Voici le code qui selon moi pose problème :
public static void fonctionPrincipale(int[][]t, int n, int i , int j)
		{
				while((i<9)&&(j<9))
				{
					if((t[i][j])!=0)
					{
						if(j==8)
						{
							j=0;
							i=i+1;
						}
						else
						{
							j=j+1;
						}
						
					}
					else
					{
						if((estDansLigne(t, n, i)==false)&&(estDansColonne(t, n, j)==false)&&(estDansCarre(t, n, i, j)==false))
						{
							t[i][j]=n;
							if(j==8)
							{
								j=0;
								i=i+1;
							}
							else
							{
								j=j+1;
							}
							n=1;
						}
						else
						{
							if(n==9)
							{
								t[i][j]=0;
								if(j==0)
								{
									j=8;
									i=i-1;
									n=n+1;;
								}
								else
								{
									j=j-1;
									n=n+1;;
								}
								
							}
							else
							{
								n=n+1;
							}
						
						}
					}
				}
		}


Et voici le code en entier :

public class sudoku_antoine
{
	
	public static boolean estDansLigne(int[][]t, int n, int i)
		{
			boolean test=false;
			int j=0;
			while((j<=8)&&(test==false))
			{
				if(t[i][j]==n)
				{
					test=true;
				}
				else
				{
					test=false;
				}
				j=j+1;
			}
		
			return test;
		}
		
		public static boolean estDansColonne(int[][]t, int n, int j)
		{
			boolean test=false;
			int i=0;
			while((i<=8)&&(test==false))
			{
				if(t[i][j]==n)
				{
					test=true;
				}
				else
				{
					test=false;
				}
				i=i+1;
			}	
			return test;
		}
		
		
		public static boolean estDansCarre(int[][]t, int n, int i, int j)
		{
			int c=0;
			boolean test=false;
			int carreligne, carrecolonne, debutcarreligne, debutcarrecolonne, fincarreligne, fincarrecolonne;
			carreligne=i/3;
			carrecolonne=j/3;
			debutcarreligne=carreligne*3;
			debutcarrecolonne=carrecolonne*3;
			fincarreligne=debutcarreligne+2;
			fincarrecolonne=debutcarrecolonne+2;
			while((c<=8)&&(test==false))
			{
				if(t[debutcarreligne][debutcarrecolonne]==n)
				{
					test=true;
				}
				else
				{
					test=false;
				}
				debutcarrecolonne=debutcarrecolonne+1;
				if(debutcarrecolonne%3==0)
				{
					debutcarrecolonne=debutcarrecolonne-3;
					debutcarreligne=debutcarreligne+1;
				}
				c=c+1;
			}	
		return test;	
		}
				
		public static void fonctionPrincipale(int[][]t, int n, int i , int j)
		{
				while((i<9)&&(j<9))
				{
					if((t[i][j])!=0)
					{
						if(j==8)
						{
							j=0;
							i=i+1;
						}
						else
						{
							j=j+1;
						}
						
					}
					else
					{
						if((estDansLigne(t, n, i)==false)&&(estDansColonne(t, n, j)==false)&&(estDansCarre(t, n, i, j)==false))
						{
							t[i][j]=n;
							if(j==8)
							{
								j=0;
								i=i+1;
							}
							else
							{
								j=j+1;
							}
							n=1;
						}
						else
						{
							if(n==9)
							{
								t[i][j]=0;
								if(j==0)
								{
									j=8;
									i=i-1;
									n=n+1;;
								}
								else
								{
									j=j-1;
									n=n+1;;
								}
								
							}
							else
							{
								n=n+1;
							}
						
						}
					}
				}
		}


	public static void main(String args[])
	{
	
	int i,j,n;
	int[][]t = new int[9][9];
	int[][]grille = new int[9][9];
	n=1;
	i=0;
	j=0;
		
	t[0][5]=6;
	t[1][1]=5;
	t[1][6]=6;
	t[2][2]=1;
	t[2][6]=5;
	t[2][8]=8;
	t[3][0]=4;
	t[3][5]=9;
	t[3][8]=7;
	t[4][1]=6;
	t[4][7]=9;
	t[5][1]=3;
	t[5][3]=1;
	t[5][6]=4;
	t[5][7]=2;
	t[6][0]=3;
	t[6][1]=1;
	t[6][3]=9;
	t[6][5]=7;
	t[7][1]=9;
	t[7][2]=8;
	t[7][4]=2;
	t[7][5]=1;
	t[7][8]=3;
	t[8][1]=2;
	t[8][3]=3;
	t[8][6]=9;
	
	new AffichageSudoku(t, grille, 300);
	
	fonctionPrincipale(t,n,i,j);
	}
}
				
				
		
					


Merci d'avance pour votre aide

Pour vous aider a m'aider , je vais vous expliquer un peu le fonctionnement du code . J'ai créer trois fonctions , une fonction pour la ligne ,une pour la colonne , et pour le carré 3*3 . Chaque fonction a pour but de vérifier si le nombre n que l'on recherche est présent ou non .
Si il n'y est pas on peut mettre ce n , si il y est dans au moins 1 des 3 fonctions , on passe au n suivant et on test .
Si on arrive a 9 , aucune solution n'est possible et donc on revient a la case d'avant en changeant le n que l'on avait mis avant .

Voila je peux aussi vous poster le programme pour afficher la grille de sudoku si vous le souhaitez .
A voir également:

2 réponses

Urielxx Messages postés 190 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 25 juin 2013 46
1 mai 2010 à 19:18
Je ne comprends pas ton algo, pour moi il n'est pas correct... On dirait que tu prends le problème dans le mauvais sens : il ne faut pas tester systématiquement toutes les possibilités, mais plutôt travailler par élimination, à moins qu'il ne s'agisse de sudoku particulièrement complexes (avec des branches à exploiter).

J'aurais fait comme ça :

A chaque case, tu fais correspondre un objet avec toutes les valeurs possibles (1 à 9).
Quand tu charges ta grille, tu figes les valeurs connues, et tu laisses les autres.
Ensuite, tu parcours ta grille, et à chaque case tu enlèves des valeurs possibles toutes les valeurs déjà trouvées :
- sur la ligne
- sur la colonne
- dans la grille 3x3
et tu passes à la case suivante. Une fois la grille parcourue, tu recommences.

Si tu fais une passe complète sans rien modifier, sois :
- tu es bloqué => pas de solution déterministe
- tu as fini ta grille

Je crois que j'ai déjà répondu à un post sur le sujet...
0
80chris Messages postés 18 Date d'inscription samedi 1 mai 2010 Statut Membre Dernière intervention 17 novembre 2012
2 mai 2010 à 00:16
Je ne sais pas si , avec mon niveau actuel je pourrais faire ceci . Mais merci de ton aide . mon algo devrait faire ceci :
si la case est différente de zéro ( il y a déjà un chiffre ) , alors on passe a la case suivante .

Sinon on teste pour un n si il est situé soit dans la ligne colonne ou carré , si c'est le cas on augmente n de 1 , si il n'y a pas de chiffre dans les 3 alors on met ce n dans la case et on passe a la case suivante .

Si un moment le n arrive a 9 ( il a fait toutes les possibilités , alors on revient a la case d'avant et on essaye avec n+1 ) . et on fait ceci tant que l'on est pas arrivé a la dernière case ( i=9 et j=9 ) .

On traite aussi toutes les exceptions ( si on est a la fin d'une ligne ou au début par exemple ) .

Voila , mais sinon t'auras pas une idée d'ou pourrait venir ce n qui prend 10 , 11 voir 12 alors qu'il devrait ne pas dépasser 9 ?
0
Urielxx Messages postés 190 Date d'inscription mardi 26 août 2008 Statut Membre Dernière intervention 25 juin 2013 46
2 mai 2010 à 02:10
pour moi, le pb vient que ton algo ne fonctionne pas... Imagine que ta grille 3x3 de départ soit :
X 8 7
6 5 4
3 2 1

Ton algo fait quoi ?
0
80chris Messages postés 18 Date d'inscription samedi 1 mai 2010 Statut Membre Dernière intervention 17 novembre 2012
2 mai 2010 à 03:14
Normalement : il se rend compte que la première case est vide , donc il va tester les fonctions , il va se rendre compte que aucune valeur n'est possible sauf 9 , et il va attacher 9 a la case . Mais je ce que je pense avoir programmer et ce que l'ordinateur comprend il y a une différence c'est sur . Toutefois il remplis quand même toutes les cases en respectant les contraintes . Même si mon algo est surement très mauvais , si il résous le Sudoku je serais déjà content
0