Vérifier que 2 nombres ne sont sur même ligne

tortue60 Messages postés 269 Statut Membre -  
walidovich_85 Messages postés 698 Statut Membre -
Bonjour,

Je souhaite faire un tableau de 4 sur 4 remplis avec les nombres de 1 à 4. Ce que je cherche c'est comment faire pour pas que les nombres ce trouvent deux fois sur la même ligne et deux fois sur la même colonne

Merci pour vos propositions

7 réponses

  1. walidovich_85 Messages postés 698 Statut Membre 73
     
    Bonjour,

    pouvez vous nous présenter une ébauche de ta part?
    autrement, voila comment procéder:
    - utiliser Math.random() pour générer un nombre aléatoire, et le changer pour avoir un nombre entre 1 et 4.
    - utiliser une boucle while dans la boucle for pour tester la présence d'un nombre dêja enregistré.

    NB:
    - si tu vise un tableau comme celui du Sudoku en taille 4, alors ça va te demander un esprie dure en math et récursivité.
    - si tu vise un tableau respectant exactement les consignes cité en message en haut, alors, il te faut une plage de nombre entre 1 et 7, pour éviter des situation de boucle infinie.

    Bonne chance
    0
  2. tortue60 Messages postés 269 Statut Membre
     
    Je vois pas trop comment faire pour la boucle while dans le for
    0
  3. walidovich_85 Messages postés 698 Statut Membre 73
     
    Bonsoir,
    je te donne une explication, et si tu n'arrive pas à developper une ébauche, je passe au code:

    int nbreGenere= (int) (Math.random()*max);
    boolean existe=true
    while(existe==true){
    //regénération du nombre après avoir
    //été trouvé dans une ligne ou une colonne
    nbreGenere= (int) (Math.random()*max);
    //éliminer le cas d'une valeur 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;
    }
    }
    }
    }

    à la sortie de cette boucle while, qui doit etre incluse dans les deux boucles for classiques (du tableau), tu seras sur que le nombre généré n'existe pas.

    NB:
    condition nécessaire, max=longeur+largeur du tableau.
    alors tableau 4x4 implique max=8

    Being normal is boring... being geek is interesting
    0
  4. tortue60 Messages postés 269 Statut Membre
     
    j'avais déjà fait sa moi:

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

    int[][] monTableau= new int[4][4];

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

    }

    }
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. walidovich_85 Messages postés 698 Statut Membre 73
     
    Bonsoir

    ce qu'il faut, c'est, avant d'affecter la valeur (int)(Math.random() * 4) + 1 à monTableau[i][j], de vérifier si cette valeur existe dêja sur la ligne [i] et la colonne [j].
    je t'ai déjà parlé de la contrainte sur le max lié a random, et pour l'éclairer, imagine que ton programme a généré des valeurs et il arrive à l'élément T[3][3] (v):
    x y 1 z
    a b 3 c
    2 4 v .
    . . . w

    si tes valeurs sont >=1 et <=4, étant donné la contrainte cité en message en top haut, le programme ne trouvera jamais une valeur v, car ttes les valeurs possible sont dja enregistrées.

    pour la valeur w, nous aurons 3+3 valeurs diffirentes, et en ajoutant w, nours devons avoir 7 valeurs diffirentes, d'ou le max doit etre 8

    Being normal is boring... being geek is interesting
    0
  7. walidovich_85 Messages postés 698 Statut Membre 73
     
    essaie ce code:

    public class tableau{
    public static void main(String[] args) throws InterruptedException {
    //Définition des dimensions
    int longueur=9, largeur=9;
    //déclaration du tableau
    int[][] monTableau= new int[9][9];
    //le max non atteint doit être au moin 18.
    int max=longueur+largeur;
    //remplissage de la matrice monTableau
    for (int i = 0; i < longueur; i++){
    for(int j = 0; j < largeur; 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);
    //éliminer le cas d'une valeur 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
    1. tortue60 Messages postés 269 Statut Membre
       
      Il y aurai pas quelque chose de plus simple
      0
    2. walidovich_85 Messages postés 698 Statut Membre 73
       
      plus simple !!!??
      de quelle simplicité tu parle?
      0
    3. tortue60 Messages postés 269 Statut Membre
       
      Bah je c pas trop
      moi on m'a qu'il fallait que je fasse 4 for pour comparer les nombres: 2 pour l'horizontal et 2 pour le verticale
      0
    4. walidovich_85 Messages postés 698 Statut Membre 73
       
      je pige rien ici.
      0
    5. tortue60 Messages postés 269 Statut Membre
       
      JE voudrai un programme très simple à comprendre et à faire
      0
  8. walidovich_85 Messages postés 698 Statut Membre 73
     
    Bonsoir tortue60

    dans ce sujet, je pense que j'ai assez expliquer les points suivants:

    1- le cahier de charge n'est pas réalisable avec des méthodes de programmation simples, parce que si tu demande un tableau comme celui du Sudoku, alors il te faut appliquer la récursivité. et je pense a ce stage, pour toi, la récursivité n'est une option.
    2- les solutions proposées ne contiennent que des méthodes simples qui ne sont même pas limitées au JAVA, je parle bien sur du "for" et "while". l'utilisation seule des boucles "for" ne va pas garantir la génération des nombres valides avec random. d'où la nécessité des boucles while.
    3- étant admis que la longueur de l'intervalle des nombres doit etre égale a la somme des dimensions du tableau, c'est a dire, dans ton cas, le tableau 4x4 implique des nombres entre 1 et 7 et pas entre 1 et 4, j'ai cité ci dessus un exemple pour montré l'impossibilité de réaliser ton cahier charge sans modification.

    pour moi, je pense qu'il te faut 2 choses importantes:
    - un cours complet du langage Java, pour pouvoir se familiariser avec les méthodes de calcul.
    - beaucoup d'exercice d'entrainement en logique, pour pouvoir traduire un probleme en un programme informatique (l'algorithmique).

    si tu en besoin, je peux te proposer des liens.

    BONNE CHANCE.
    0
    1. tortue60 Messages postés 269 Statut Membre
       
      salut,

      Je voudrais bien des liens si tu en connais
      0