Ça n'a pas grand'chose à voir avec le C, mais comme il n'y a pas de forum algorithme, je poste ici.
Comment remplir une matrice carrée de taille N (>3), avec les nombres de 1 à N dans chaque ligne, mais en s'arrangeant pour qu'il n'y ait qu'une occurence de chaque nombre par colonne ?
Exemple:
Ok
! Ok
D'avance un grand merci.
Edgar;
- Edité par edgarjacobs 21 février 2022 à 16:15:40
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Échanger deux colonnes ne pose aucun problème pour les colonnes (il y a aura toujours une occurrence de chaque chaque chiffre dans ces colonnes) et on échange deux nombres forcément différents dans une ligne. Idem pour l'échange de ligne, mais transposé.
Donc si tu mélanges les colonnes et si ce n'est pas suffisant les lignes tu devrais garder la propriété «une occurrence par ligne et colonne».
Tu n'indiques pas si si tu as d'autres contraintes. Sinon il suffit de remplir la matrice avec forme de l'exemple de WhiteCrow: première ligne: 1, 2, ..., N-1, N seconde ligne : 2, 3, ..., N, 1 troisième ligne: 3, ..., N, 1, 2 ... dernière ligne : N, 1, ...N-2, N-1.
Par construction, on n'a jamais 2 même nombres sur chaque ligne et chaque colonne et en plus on obtient une matrice symétrique.
C'était clair pour moi, mais évidemment pas pour vous. Désolé. Ce que je souhaite faire, c'est un skyscrapers, mais avec une présentation différente, en "3d" et en couleur.
- Edité par edgarjacobs 21 février 2022 à 16:33:30
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Bah tu as toute une floppée de transformations qui laisse ta contrainte valide comme l'échange de colonne, l'échange de lignes (ce qui permet de faire un fisher yates), l'ajout d'une constante à chaque cellule (modulo ton range), l'échange de toutes les occurrences d'une valeur avec celles d'une autre, rotations, translations, symétrie horizontale/verticale …
Sinon tu as la possibilité d'essayer de dénombrer toutes les grilles possibles, de trouver une fonction qui à un entier associe une matrice possédant la propriété skyscrapers et d'en choisir une uniformément dans cet intervalle d'entiers (mais c'est un peu overkill en sachant qu'un fisher yates est amplement suffisant).
La difficulté est de montrer que pour toute paire de matrices qui ont la propriété indiquée, il existe toujours une séquence de permutations qui permet de passer de l'une à l'autre.
(...) Sinon tu as la possibilité d'essayer de dénombrer toutes les grilles possibles (....)
C'était mon idée de départ: générer toutes les grilles possibles, mettre le tout dans un fichier, et faire un rand() sur le nombre de lignes du fichier pour sélectionner un problème à résoudre.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
(...) Sinon tu as la possibilité d'essayer de dénombrer toutes les grilles possibles (....)
C'était mon idée de départ: générer toutes les grilles possibles, mettre le tout dans un fichier, et faire un rand() sur le nombre de lignes du fichier pour sélectionner un problème à résoudre.
L'avantage avec le listing c'est que ça reste de nos jours raisonnables point de vue taille et que tu peux proposer des grilles non déjà proposées. Du moins si tu ne veux pas proposer des grilles plus grande qu'un 5×5.
Sinon, ce que je proposais de chercher était une fonction (plus au sens mathématique) qui permet de ranker une grille (associer chaque grille à un entier) et unranker (obtenir la grille associée à un entier) sans passer par un fichier ; un peu à la manière dont on peut ranker et unranker une permutation ou une combinaison.
On pourrait pousser jusqu'à un 7×7, presque sans doublon avec un (ou plusieurs) filtres de bloom sans avoir à recourir à des entiers longs.
Merci à tous pour vos réponses. Je vais explorer les différentes pistes et vous tiens au courant.
Edgar;
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Remplir une matrice
× 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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
En recherche d'emploi.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent