Sudoku; valider un quadran 3x3 [Résolu/Fermé]

Signaler
-
Messages postés
1663
Date d'inscription
lundi 24 janvier 2011
Statut
Membre
Dernière intervention
6 septembre 2020
-
Bonjour,

J'ai beau me creuser la tête, mais je n'arrive pas à trouver la solution; comment valider un carré 3x3 dans un sudoku. Je ne veux pas vérifier toute la grille, mais seulement le carré dans lequel je viens de placer un chiffre.

ma méthode doit absolument utiliser commencé ainsi:


public boolean estDansLeBloc (int _valeur, int _ligne, int _colonne)


j'avais commencé par faire ceci:
Code :

public boolean estDansLeBloc (int _valeur, int _ligne, int _colonne){
//for (int i = 0; i < 3 ; i++) {
for (int j = 0; j < 3; j++) {
if (_valeur == board[(_ligne - 1 + 3) / 3][(_colonne + 3) / 3]) {
return false;
}
}
return true


cependant comme vous pouvez le constater, peut importe la ligne ou la colonne, on vérifie toujours le premier carré soit les ligne et colonne de 0 à 2. Alors si j'ai entré un chiffre dans la colonne 5, ca ne fonctionne pas du tout.
Des idées?

Je me doute bien que je dois utiliser mon i et mon j quelque part dans ma formule pour avoir la bonne ligne et la bonne colonne, c'est justement là que je bloque.
Par exemple si je place un chiffre dans la case (4,8) ma méthode dois vérifier les ligne 4,5 et 6, puis vérifier les colonnes 7, 8 et 9. Et éventuellement avoir vérifier les 9 case de ce petit carré 3x3.

Merci

3 réponses

Messages postés
1663
Date d'inscription
lundi 24 janvier 2011
Statut
Membre
Dernière intervention
6 septembre 2020
593
Pas très pratique, tu te sers juste pas de la boucle :
public boolean estDansLeBloc (int _valeur, int _ligne, int _colonne){
int i,j ;
// En supposant que  0=<_ligne < 9
// On travaille sur des entiers (division entière) donc première ligne du bloc :
int prem_li = (int) (_ligne/3) * 3;
// Première colonne du bloc :
int prem_col = (int) (_colonne /3) *3;
for (int i = prem_li ; i < prem_li + 3 ; i++) {
   for (int j = prem_col; j < prem_col +3 ; j++) {
    if (_valeur == board[i][j]) {
        return false; 
    }
   }
return true ;
}


Trust me and keep calm, I'm an engineer !
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
1663
Date d'inscription
lundi 24 janvier 2011
Statut
Membre
Dernière intervention
6 septembre 2020
593
Salut,

Il manque des variables dans la ligne
board[(_ligne - 1 + 3) / 3][(_colonne + 3) / 3]
: les numéros ne changent pas...
Messages postés
2
Date d'inscription
mardi 20 décembre 2016
Statut
Membre
Dernière intervention
10 août 2018

Finalement j'ai trouvé une une méthode, ce n'est peut-être pas la plus simple, mais elle fonctionne...

alors voici, si jamais ça peut aider quelqu'un d'autre:


public boolean estDansLeBloc (int _valeur, int _ligne, int _colonne) {
int y = 1;
_ligne = (_ligne + 3) / 3;
//}
if (_ligne == 2) {
_ligne = 4;
}
if (_ligne == 3) {
_ligne = 7;
}
_colonne = (_colonne + 3) / 3;
if (_colonne == 2) {
_colonne = 4;
y = 4;
}
if (_colonne == 3) {
_colonne = 7;
y = 7;
}

for (int i = 0; i < 3 ; i++) {
for (int j = 0; j < 3; j++) {
if (board[_ligne-1][y-1] == _valeur) {
return false;
}
y++;
}
y = _colonne;
_ligne++;
}
return true;
}


Merci
Messages postés
1663
Date d'inscription
lundi 24 janvier 2011
Statut
Membre
Dernière intervention
6 septembre 2020
593
cette solution est très très moche : dans un
for
, la variable incrémentée est déjà mise dedans alors pourquoi utiliser
y++
et
 ligne++
?

Voir solution ci-dessous...