Partage
  • Partager sur Facebook
  • Partager sur Twitter

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

problème de respect des contraintes

    1 mai 2010 à 16:44:11

    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 .
    • Partager sur Facebook
    • Partager sur Twitter
      3 mai 2010 à 15:25:06

      Poste le ca nous aidera grandement, car la je ne vois pas comment t'aider
      • Partager sur Facebook
      • Partager sur Twitter
        3 mai 2010 à 18:30:53

        C'est beaucoup beaucoup trop linéaire, on se noie dans les lignes de code, même s'il y'avait un commentaire par ligne.
        J'te dirais bien tente ta chance sur le forum C eux qui sont habitués au procédural, et encore...
        C'est beaucoup trop dur de t'aider là ^^'
        • Partager sur Facebook
        • Partager sur Twitter

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

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown