Sudoku; valider un quadran 3x3

Résolu/Fermé
Rashlack - 20 déc. 2016 à 20:14
Hydr0s Messages postés 1678 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 24 août 2022 - 21 déc. 2016 à 19:38
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

Hydr0s Messages postés 1678 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 24 août 2022 672
Modifié par Hydr0s le 21/12/2016 à 19:42
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
Hydr0s Messages postés 1678 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 24 août 2022 672
21 déc. 2016 à 09:59
Salut,

Il manque des variables dans la ligne
board[(_ligne - 1 + 3) / 3][(_colonne + 3) / 3]
: les numéros ne changent pas...
0
Rashlack Messages postés 2 Date d'inscription mardi 20 décembre 2016 Statut Membre Dernière intervention 10 août 2018
21 déc. 2016 à 17:52
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
0
Hydr0s Messages postés 1678 Date d'inscription lundi 24 janvier 2011 Statut Membre Dernière intervention 24 août 2022 672
21 déc. 2016 à 19:38
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...
0