/**
 * Etat du jeu --
 * Ressources:
 *   - un tableau d'entier de taille 9x9 pour la grille du jeu;
 *   - un tableau de booléens de taille 9x9 pour connaîtres les cases
 *     modifiables (voir ci-dessous);
 *   - deux entiers qui donnent les coordonnées de la case dite 'sélectionnée'.
 *
 * Quelques principes:
 *   - certaines cases de la grille ne doivent pas être modifiables (celles qui
 *     correspondent aux cases révélées du problème de départ);
 */

class GameState {

    /**
     * Coordonnées de la case sélectionnée
     */
    public int selectedX;
    public int selectedY;

    /**
     * Grille du jeu
     */
    public int[][] grille;

    /**
     * Tableau indiquant si une case de la grille est modifiable ou non 
     */
    boolean[][] modifiable;

    /**
     * Crée un jeu vide
     */
    GameState() {
	grille = new int[9][9];
    }

    /**
     * Crée un jeu à partir d'une grille donnée.
     * @param grille est un tableau d'entiers de taille 9x9
     *        dont les valeurs sont comprises entre 0 et 9.
     *        La valeur 0 signifie une case vide.
     */
    GameState(int[][] grille) {
	// à faire
    }

    /**
     * Crée un jeu à partir des données contenues dans un fichier
     * @param fname nom du fichie contenant les données.
     *        Le fichier contient une chaîne de caractères représentant un problème.
     *        La chaîne contient 81 caractères compris entre '0' et '9'.
     *        La valeur '0' représente une case vide. Les 9 premiers 
     *        caractères représentent la première ligne, les 9 suivants, 
     *        la deuxième, etc.
     */
    GameState(String fname) {
	grille = new int[9][9];
	// à finir
    }

    /**
     * Donne la valeur de la cellule x,y
     */
    int getCell(int x, int y) {
	// à faire
    }

    /**
     * Modifie la valeur de la colonne sélectionnée
     */
    void setSelectedX(int x) {
	// à faire
    }
	
    /**
     * Modifie la valeur de la ligne sélectionnée
     */
    void setSelectedY(int y) {
	// à faire
    }

    /**
     * Indique si la case est sélectionnée ou non
     */
    boolean isSelected(int x, int y) {
	// à faire
    }

    /**
     * Modifie la valeur contenue dans la case sélectionnée
     */
    void setSelectedCell(int n) {
	// à faire
    }
	
    /**
     * Vérifie l'appartenance d'une valeur à une ligne de la grille
     * @param y numéro de la ligne (entre 0 et 8 inclus).
     * @param n valeur à vérifier.
     * @return donne 'true' si 'n' est déjà présent dans la ligne 'y',
     *         donne 'false' sinon.
     */
    boolean memLine(int y, int n) {
	// à faire
    }

    /**
     * Vérifie l'appartenance d'une valeur à une colonne de la grille
     * @param x numéro de la colonne (entre 0 et 8 inclus).
     * @param n valeur à vérifier.
     * @return donne 'true' si 'n' est déjà présent dans la colonne 'x',
     *         donne 'false' sinon.
     */
    boolean memCol(int x, int n) {
	// A faire
    }

    /**
     * Vérifie l'appartenance d'une valeur à un carré.
     * Un carré est identifié par sa case supérieure gauche.
     * @param x numéro de colonne de la case supérieure gauche.
     * @param y numéro de ligne de la case supérieure gauche.
     * @return 'true' si 'n' est déjà présent dans le carré,
     *         'false' sinon
     */
    boolean memSquare(int x, int y, int n) {
	// à faire
    }

    /**
     * Indique s'il est valide de placer une valeur dans la case sélectionnée.
     * Il est valide de placer une valeur 'n' dans la case de coordonnées
     * 'x' et 'y' si et seuelemnt si:
     *   - la case 'x','y' est modifiable et
     *   - la valeur 'n' n'est pas présente dans la ligne 'y' et
     *   - la valeur 'n' n'est pas présente dans la colonne 'x' et
     *   - la valeur 'n' n'est pas présente dans le carré où se trouve
     *     la case 'x','y'.
     * @param n valeur à placer
     * @return 'true' si on peut placer 'n' dans la case sélectionnée,
     *         'false' sinon.
     */
    boolean validMove(int n) {
	// à faire
    }
    

}