Tp tableau et sudoku

Fermé
Utilisateur anonyme - Modifié par KX le 4/10/2015 à 00:20
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 4 oct. 2015 à 00:31
Bonjour,
J'ai un Tp a rendre et voilà je suis bloqué a la fonction toutseul je n'arrive pas a trouver la solution, je voius met le code ci dessous merci de votre aide
Romain

public class Sudoku {
    /*
     * API, TP n°2 Groupe 4 Binôme 
     */
    static final int n = 3; // taille des régions

    /*
     * Terminologie
     * 
     * m est un plateau (de sudoku) si 
     * - m est un int [][] ne contenant que des entiers compris entre 0 et 9 
     * - m.length = n^2 
     * - m[i].length = n^2 pour tous les i de 0 à n^2-1
     */

    static String enClair(int[][] m) {
        /*
         * Prérequis :
         * m est un plateau de sudoku
         *  
         * Résultat :
         * une chaîne dont l'affichage permet de visualiser m
         */
        String r = "";
        for (int i = 0; i < n * n; i++) {
            for (int j = 0; j < n * n; j++) {
                r = r + m[i][j] + " ";
                if (j % n == n - 1) {
                    r = r + "  ";
                }
            }
            if (i % n == n - 1) {
                r = r + "\n";
            }
            r = r + "\n";
        }
        r = r + " ";
        return r;
    } // enClair

    static int[][] aPartirDe(String s) {
        /*
         * Prérequis :
         * s est une chaîne contenant au moins n^4 chiffres décimaux
         * 
         * Résultat :
         * un plateau de sudoku initialisé avec les n^4 premiers chiffres décimaux de s (les chiffres sont considérés comme rangés par lignes).
         */
        int[][] m = new int[n * n][n * n];
        int k = 0;
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[i].length; j++) {
                while ("0123456789".indexOf(s.charAt(k)) == -1) {
                    k++;
                }
                m[i][j] = (int) s.charAt(k) - (int) '0';
                k++;
            }
        }
        return m;

    } // aPartirDe

    static boolean presentLigne(int[][] m, int v, int i) {
        /*
         * Prérequis :
         * - m est un plateau de sudoku
         * - v est compris entre 1 et n^2 
         * - i est compris entre 0 et n^2-1
         * 
         * Résultat :
         * dans m, v est présent dans la ligne i
         */
        boolean ligne = false;
        int k = 0;
        while (k < 9) {
            if (m[i][k] == v) {
                ligne = true;
            }
            k++;
        }
        return ligne;
    }

    static boolean presentColonne(int[][] m, int v, int j) {
        /*
         * Prérequis :
         * - m est un plateau de sudoku
         * - v est compris entre 1 et n^2
         * - j est compris entre 0 et n^2-1
         * 
         * Résultat :
         * dans m, v est présent dans la colonne j
         */
        boolean colonne = false;
        int k = 0;
        while (k < 9) {
            if (m[k][j] == v) {
                colonne = true;
            }
            k++;
        }
        return colonne;
    }

    static boolean presentRegion(int[][] m, int v, int i, int j) {
        /*
         * Prérequis :
         * - m est un plateau de sudoku
         * - v est compris entre 1 et n^2
         * - i et j sont compris entre 0 et n^2-1
         * 
         * Résultat :
         * dans m, v est présent dans la région contenant la case <i, j>
         */
        int l;
        int c;
        for (l = (i / n) * n; l < (i / n) * n + n; l++) {
            for (c = (j / n) * n; c < (j / n) * n + n; c++) {
                if (m[l][c] == v) {
                    return true;
                }
            }
        }
        return false;
    }

    static boolean[] lesPossiblesEn(int[][] m, int i, int j) {
        /*
         * Prérequis :
         * - m est un plateau de sudoku
         * - i et j sont compris entre 0 et n^2-1
         * - m[i][j] vaut 0
         * 
         * Résultat :
         * un tableau r de longueur n^2+1 tel que, dans la tranche r[1..n^2]
         * r[v] indique si v peut étre placé en <i, j>
         */
        boolean r[] = new boolean[10];
        int z = 1;
        while (z < 10) {
            if (presentLigne(m, z, i) || presentColonne(m, z, j) || presentRegion(m, z, i, j)) {
                r[z] = false;
            } else
                r[z] = true;
            z++;
        }
        return r;
    }

    static String enClair(boolean[] t) {
        /*
         * Prérequis :
         * t.length != 0
         * 
         * Résultat :
         * une chaîne contenant tous les indices i de la tranche [1..t.length-1] tels que t[i] soit vrai
         */
        String r = "{";
        for (int i = 1; i < t.length; i++) {
            if (t[i]) {
                r = r + i + ", ";
            }
        }
        if (r.length() != 1) {
            r = r.substring(0, r.length() - 2);
        }
        return r + "}";
    } // enClair)

    static int toutSeul(int[][] m, int i, int j) {
        /*
         * Prerequis :
         * - m est un plateau de sudoku
         * - i et j sont compris entre 0 et n^2-1
         * - m[i][j] vaut 0
         * 
         * Resultat :
         * - v si la seule valeur possible pour <i, j> est v
         * - -1 dans les autres cas
         */
        boolean b = false;
        int val = 0;
        boolean[] r = lesPossiblesEn(m, i, j);
        for (int k = 0; k < 10; k++) {
            if (r[k] == true || b == false) {
                b = true;
                k = val;
            }
            return val;
        }
        // A MODIFIER
    } // toutSeul

    static void essais(String grille) {
        /*
         * Prerequis :
         * grille represente une grille de sudoku (les chiffres sont consideres comme ranges par lignes)
         * 
         * Effet :
         * 1) affiche en clair la grille
         * 2) affecte, tant que faire se peut, toutes les cases pour lesquelles il n'y a qu'une seule possibilité
         * 3) affiche en clair le résultat final
         */
        int[][] m = aPartirDe(grille);
        System.out.println("Probleme\n\n" + enClair(m));

        // A COMPLETER

        System.out.println("Il se peut qu'on ait avance\n\n" + enClair(m));
    } // essais

    public static void main(String[] args) {
        String grille1 = 
                  "040 001 006 \n" 
                + "007 900 800 \n" 
                + "190 086 074 \n" 
                + "            \n" 
                + "200 690 010 \n" 
                + "030 405 090 \n" 
                + "060 017 003 \n" 
                + "            \n" 
                + "910 750 042 \n" 
                + "008 002 700 \n" 
                + "400 300 080   ";
        String grille2 = 
                  "030 000 006 \n" 
                + "000 702 300 \n" 
                + "104 038 000 \n" 
                + "            \n" 
                + "300 020 810 \n" 
                + "918 000 265 \n" 
                + "062 050 007 \n" 
                + "            \n" 
                + "000 140 708 \n" 
                + "001 209 000 \n" 
                + "800 000 020   ";

        // essais(grille1) ;
        // essais(grille2) ;

        // for (int i = 0; i < 10; i++)
        // System.out.println(lesPossiblesEn(aPartirDe(grille2),5,0)[i]);

        System.out.println(enClair(lesPossiblesEn(aPartirDe(grille2), 5, 0)));

        System.out.println(toutSeul(aPartirDe(grille2), 5, 0));
    }
}
A voir également:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
4 oct. 2015 à 00:31
Bonjour,

Ta question initiale ressemblait à ça et c'est difficilement illisible !

J'ai modifié la question pour modifier les accents, ajouter les balises de codes et l'indentation. C'est quand même plus lisible comme ça :


Merci de le faire toi même à l'avenir !
0