Tableau deux dimenssions

Fermé
Utilisateur anonyme - 20 mars 2013 à 22:33
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 - 21 mars 2013 à 16:06
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

A voir également:

5 réponses

walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
20 mars 2013 à 23:14
bonsoir,

pour etre sur la meme page, tu veux un tableau comme celui de sudoku?
0
ngounou25 Messages postés 96 Date d'inscription mercredi 6 août 2008 Statut Membre Dernière intervention 5 juillet 2013 4
21 mars 2013 à 00:48
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.
0
tksteph Messages postés 204 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 3 janvier 2018 25
21 mars 2013 à 01:40
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!)
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 21/03/2013 à 02:02
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ngounou25 Messages postés 96 Date d'inscription mercredi 6 août 2008 Statut Membre Dernière intervention 5 juillet 2013 4
21 mars 2013 à 15:23
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;
        }


0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
21 mars 2013 à 16:06
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.
0