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

80chris Messages postés 18 Date d'inscription   Statut Membre Dernière intervention   -  
80chris Messages postés 18 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   46
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   46
 
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   Statut Membre Dernière intervention  
 
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