Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
JSudokuResolver - Board.java

Board.java

Caricato da: R0gerblack
Scarica il programma completo

  1. /* Program: JSudokuResolver | Class: Board
  2.     Copyright (C) 2014  Ruggiero Altini
  3.  
  4.     This program is free software: you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation, either version 3 of the License, or
  7.     (at your option) any later version.
  8.  
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU General Public License
  15.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  16. */
  17.  
  18. package com.ithsoft.sudoku;
  19.  
  20. /**
  21.  * <b>Classe</b> Board. <p>
  22.  * Questa classe definisce la tavola del Sudoku da risolvere.
  23.  * Per utilizzarla e' sufficiente dichiararne un'istanza e inserire come parametro un array di interi da 81 elementi
  24.  * <p>Sebbene il gioco del Sudoku sia formalmente quadrato, per motivi di semplicita', qui viene ridotto come una serie sola di numeri.
  25.  * E' possibile immettere valori nella tavola con il metodo push o toglierli con il metodo pop.
  26.  * @author      Ruggiero Altini
  27.  * @version     1.0
  28.  */
  29. public class Board
  30. {
  31.         /**
  32.         * Contiene tutti gli elementi della tavola di gioco
  33.         */
  34.         public int[] elems;
  35.         /**
  36.         * Contiene la posizione degli elementi inizialmente vuoti (Attenzione:
  37.         * Questi sono gli elementi che il Resolver deve riempire, ma vengono
  38.         * definiti bianchi anche successivamente.
  39.         */
  40.         public int[] pwhites;
  41.         /**
  42.         * Contiene gli elementi inizialmente vuoti che il Resolver deve riempire.
  43.         * Per questo motivo, la lunghezza di questo array e' minore di {@code  elems}. <p>
  44.         * Per non perdere la posizione di questi elementi, nella variabile pwhites viene salvata la loro locazione
  45.         * nella tavola di gioco
  46.         * @see elems
  47.         */
  48.         public int[] whites;
  49.         /**
  50.         * Contiene l'elemento di punta dello stack
  51.         */
  52.         private int top;
  53.         /**
  54.         * Contiene il numero degli 0 inseriti nell'inizializzazione dell'oggetto
  55.         */
  56.         private int blanks;
  57.         /**
  58.         * Contiene gli elementi massimi della griglia
  59.         */
  60.         private final int size = 81;
  61.         /**
  62.         * Conta tutti i push effettuati, utile per verificare se e' difficile piu' un Sudoku o un altro
  63.         */
  64.         private long pushes;
  65.         /**
  66.         * Conta tutti i pop effettuati, utile per verificare quante volte un programma "ritorna sui propri passi"
  67.         */
  68.         private long pops;
  69.        
  70.         /**
  71.         * Inizializza una tavola di gioco vuota
  72.         * @since 1.0
  73.         */
  74.         public Board() {
  75.                 int[] def = new int[size];
  76.                 for(int e : def) e = 0;
  77.                 elems = def;
  78.                 initialize();
  79.         }
  80.         /**
  81.         * Inizializza una tavola di gioco sulla base dell'array.
  82.         * @param grid Array di numeri da prendere in input
  83.         * @since 1.0
  84.         */
  85.         public Board(int[] grid)
  86.         {
  87.                 elems = grid;
  88.                 initialize();
  89.         }
  90.        
  91.         /**
  92.         * <p>Il metodo {@code initialize} si occupa di inizializzare le variabili della tavola di gioco
  93.         * una volta creata. </p>
  94.         * In piu' qui vengono assegnate alla variabile {@code whites} gli 0 iniziali e alla variabile
  95.         * {@code pwhites} le rispettive posizioni.
  96.         * @since 1.0
  97.         */
  98.         private void initialize()
  99.         {
  100.                 blanks = 0;
  101.                 pushes = 0;
  102.                 pops = 0;
  103.                 top = -1;
  104.                 // Conta i bianchi (gli 0) presenti
  105.                 for(int e : elems) if(e == 0)  blanks++;
  106.                 // Inizializza l'array con il numero di bianchi creato
  107.                 whites = new int[blanks];
  108.                 pwhites = new int[blanks];
  109.                 int count = 0;
  110.                 for(int i = 0; i < size; i++)
  111.                 {
  112.                         if(elems[i] == 0)
  113.                         { // Salva in pwhites le posizioni dei punti bianchi
  114.                                 whites[count] = 0;
  115.                                 pwhites[count] = i;
  116.                         count++;
  117.                         }
  118.                 }
  119.         }
  120.        
  121.         /**
  122.         * <p>La funzione {@code getPushes} restituisce il valore della variabile privata {@code pushes} (che si occupa di contare i push effettuati). </p>
  123.         * @return pushes
  124.         * @since 1.0
  125.         */
  126.         public long getPushes()
  127.         {
  128.                 return pushes;
  129.         }
  130.         /**
  131.         * <p>La funzione {@code getPops} restituisce il valore della variabile privata {@code pops} (che si occupa di contare i push effettuati). </p>
  132.         * @return pops
  133.         * @since 1.0
  134.         */
  135.         public long getPops()
  136.         {
  137.                 return pops;
  138.         }
  139.         /**
  140.         * <p>La funzione {@code getBlanks} restituisce il valore della variabile privata {@code blanks} (che contiene gli 0 iniziali). </p>
  141.         * @return blanks
  142.         * @since 1.0
  143.         */
  144.         public int getBlanks()
  145.         {
  146.                 return blanks;
  147.         }
  148.         /**
  149.         * <p>La funzione {@code getTop} restituisce il valore della variabile privata {@code top} (che contiene l'elemento di punta dello stack). </p>
  150.         * @return top
  151.         * @since 1.0
  152.         */
  153.         public int getTop()
  154.         {
  155.                 return top;
  156.         }
  157.         /**
  158.         * <p>La funzione {@code getSize} restituisce il valore della variabile privata {@code size} (che contiene il numero degli elementi della tavola). </p>
  159.         * @return size
  160.         * @since 1.0
  161.         */
  162.         public int getSize()
  163.         {
  164.                 return size;
  165.         }
  166.        
  167.         /**
  168.         * <p>Il metodo {@code push} immette un valore nello stack. </p>
  169.         * @param value Questa variabile corrisponde al numero da aggiungere allo stack. Da precisare che questo numero e'
  170.         * inseribile senza previo controllo di legalita'.
  171.         * @since 1.0
  172.         */
  173.         public void push(int value) // Mette un valore nello stack
  174.         {       // Verifica se lo stack e' pieno
  175.                 if(top == blanks - 1)
  176.                         System.out.println("Log: Griglia Piena!");
  177.                 else
  178.                 {      
  179.                         pushes++;
  180.                         whites[++top] = value;
  181.                         elems[pwhites[top]] = value;
  182.                 }
  183.         }
  184.        
  185.         /**
  186.         * <p>Il metodo {@code pop} rimuove un valore dallo stack. </p>
  187.         * @since 1.0
  188.         */
  189.         public void pop() // Rimuove un valore dallo stack
  190.         {
  191.                 if(top == -1) // Se la griglia e' vuota non fare niente
  192.                 {
  193.                         System.out.println("Log: Griglia vuota!");
  194.                 }else // Altrimenti rimuovi un valore dallo stack
  195.                 {
  196.                         pops++;
  197.                         whites[top] = 0;
  198.                         elems[pwhites[top]] = 0;
  199.                         top--;
  200.                 }
  201.         }
  202.        
  203.         /**
  204.         * <p>La funzione {@code toString} restituisce la griglia di gioco in maniera "quadrata", ovvero viene troncata ogni 9 elementi e mandata a capo.
  205.         *
  206.         * @since 1.0
  207.         */
  208.         public String toString() // Stampa la griglia
  209.         {
  210.                 StringBuilder str = new StringBuilder();
  211.                 int count = 0;
  212.                 for(int i = 0; i < size; i++)
  213.                 {      
  214.                         // Ogni tre numeri, dai uno spazio
  215.                         if(i % 3 == 0 && i % 9 != 0) str.append(" ");
  216.                         // La griglia e' in realta' una serie di interi, spezzala ogni 9
  217.                         if(i % 9 == 0) str.append("\n");
  218.                         // Ogni 3 file di numeri, manda due volte a capo per distanziare i blocchi
  219.                         if(i % 27 == 0) str.append("\n\n");
  220.                         // Dai uno spazio dopo il numero
  221.                         str.append(elems[i] + " ");
  222.                         count++;
  223.                 }
  224.                 str.append("\n");
  225.                 return str.toString();
  226.         }
  227.        
  228. }