Tableau deux dimenssions [Fermé]

Signaler
-
Messages postés
608
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
25 octobre 2015
-
Bonjour,

Je cherche à faire un tableau de 9 ligne sur 9 colonnes avec les nombres de 1 à 9. J'ai réussi à le faire et le remplir. Maintenant, je souhaiterais ne pas avoir deux fois le même nombre sur la même ligne ni sur la même colonne. Je pesne qu'il faut faire des for mais je c'est pas trop comment m'y prendre.

Voici ce que j'ai fait:

import java.util.Scanner;
public class tableau{
public static void main(String[] args) {

int[][] monTableau= new int[9][9];

//remplissage de la matrice monTableau
for (int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
monTableau[i][j]= (int) (int)(Math.random() * 9) + 1;
System.out.print(monTableau[i][j]);
}
System.out.println();
}

}

}
Merci de votre aide

5 réponses

Messages postés
608
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
25 octobre 2015
75
bonsoir,

pour etre sur la meme page, tu veux un tableau comme celui de sudoku?
Messages postés
96
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
5 juillet 2013
4
Salut,

Vu la description, y a aucun doute. C'est du Sodoku.
Beh comme je ne connais pas dans quel but tu voudrais cette algorithme, et surtout que je ne connais pas tes capacités d'appréhension, je te proposerais volontiers l'algorithme classique ; celui faisant usage de la récursivité : c'est simple, relativement facile à appréhender, mais c'est de la merde. Ton programme tournera un bon moment avant de te donner "une" configuration valide.

Pour ton problème (qui entre dans le cadre de l'intelligence artificiel), je te conseillerais de voir avec des algorithmes heuristiques ou/et les algorithmes méta-heuristique (de préférence) qui eux, sont beaucoup moins facile à cerner, mais les ayant sous la main.
Messages postés
204
Date d'inscription
samedi 20 mars 2010
Statut
Membre
Dernière intervention
3 janvier 2018
24
Salut,
Pout ton problème tels que tu le décris, tu peux modifier ton code comme suit,

List listeLigne;
List listeCol;
for (int i = 0; i < 9; i++)
{
listeLigne= new ArrayList(); // Tu crée une liste qui contiendra les differentes
// valeurs d'une ligne,

for(int j = 0; j < 9; j++)
{
ListeCol= new ArrayList();
int var = (int) (int)(Math.random() * 9) + 1;
while (listLigne.contains(var)){ //Vérifie que la ligne n'a pas la
//valeur
var = (int) (int)(Math.random() * 9) + 1;
for (int k=0; k<j;k++){
listeCol.add(T[k][j]); // La tu crée la liste des elements de la
// colonne dans laquelle tu te trouve
}
while (listeCol.contains(var)){
var = (int) (int)(Math.random() * 9) + 1; // Tu vérifie que ta colone ne
//contient pas déja la valeur

}

}


monTableau[i][j]= var;
System.out.print(monTableau[i][j]);
}
System.out.println();
}


En Gros avant d'affecter une valeur à une position donnée, tu vérifies dabord si elle ne figure pas déja sur la ligne ou la colonne
.
Un peu lourd comme Algo, mais il répond bien à ta question je crois

Si toutefois il s'agit effectivement du SUDOKU, tu peux proceder comme indiqué dans le post précedent, (Heuristique!)
Messages postés
608
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
25 octobre 2015
75
Bonjour,

j'espère d'abord qu'il ne parle pas du Sudoku, car si c'est le cas, alors, y'a une route "of shit" de récursivité qui demande une logique dure en mathématique.

alors, s'il ne parle pas de Sudoku, c a dire, qu'il veux juste un tableau dont les éléments ne se répètent pas en ligne et en colonne, alors, le valeur minimale du maximum lié généré lié à "random" doit être= 9+9= 18: supposant qu'on va générer le dernier élément T(9,9), où il ya 8 valeurs différentes en ligne 9, et 8 valeurs différente en colonne 9, ceci implique alors, 8+8=16 valeurs différentes. et en ajoutant le dernier (+1), nous aurons au moins 17 valeurs différentes. d'où le max doit être obligatoirement supérieur ou égal à 18, pour éviter le cas des boucles infinies.

voila une ébauche qui fonctionne (j'ai bien sur éliminé le ZERO :D ):


public class tableau{
public static void main(String[] args) throws InterruptedException {
//déclaration du tableau
int[][] monTableau= new int[9][9];
//le max non atteint doit être au moin 18.
int max=18;
//remplissage de la matrice monTableau
for (int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
//première génération pou l'élément T(0,0)
int nbreGenere= (int) (Math.random()*max);
boolean existe=true;
while(existe){
//regénération du nombre après avoir
//été trouvé dans une ligne ou une colonne
nbreGenere= (int) (Math.random()*max);
//vérifier si la valeur générée est nulle.
while(nbreGenere==0){
nbreGenere= (int) (Math.random()*max);
}
existe=false;
//recherche verticale
//bien sur si on est pas dêja à la 1iere ligne
if(i!=0){
for (int k = 0; k < i; k++){
if(monTableau[k][j]==nbreGenere){
existe=true;
}
}
}
if(j!=0){
//recherche horizontale
//bien sur si on est pas dêja à la 1iere colonne
for (int l = 0; l < j; l++){
if(monTableau[i][l]==nbreGenere){
existe=true;
}
}
}
}
//élément non trouvé puisque
//on a sortis de la boucle while
monTableau[i][j]=nbreGenere;
//un peu de stylisme pour l'affichage
if(monTableau[i][j]<10)
System.out.print("0"+monTableau[i][j]+" ");
else
System.out.print(monTableau[i][j]+" ");
}
System.out.println();
}
}
}

Being normal is boring... being geek is interesting
Messages postés
96
Date d'inscription
mercredi 6 août 2008
Statut
Membre
Dernière intervention
5 juillet 2013
4
Salut,

S'il ne parle pas du Sodoku et que les contraintes ne sont liées qu'aux lignes et aux colonnes, alors je lui suggère de créer un truc aussi simple que le suivant :

1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2
4 5 6 7 8 9 1 2 3
5 6 7 8 9 1 2 3 4
6 7 8 9 1 2 3 4 5
7 8 9 1 2 3 4 5 6
8 9 1 2 3 4 5 6 7
9 1 2 3 4 5 6 7 8

Une boucle comme celle-ci le fait assez aisément :

    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++) {

            monTableau[i][j] = (i + j + 1) % 9;
        }


Messages postés
608
Date d'inscription
mardi 12 janvier 2010
Statut
Membre
Dernière intervention
25 octobre 2015
75
on peut meme générer un tableau sudoku, (fake) sans random. il suffit de décaler les valeurs.
mais la présence de random donne de la vivacité et du dynamisme aux nombres et au tableau bien sur.