Advertisement
Guest User

Sudoku Resolver

a guest
Jun 10th, 2011
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.57 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. class sudoku
  5. {
  6.     private int[][] griglia;
  7.     private int[][] griglia_semplificata;
  8.     public sudoku(String filename)
  9.     {
  10.         griglia = new int[9][9]; //Griglia del sudoku
  11.         File file = new File(filename);
  12.         BufferedReader openfile;
  13.         try
  14.         {
  15.             openfile=new BufferedReader(new FileReader(file)); 
  16.             String line = "";
  17.             int riga = 0;
  18.             boolean terminate = false;
  19.             while (true)
  20.             {
  21.                 line = openfile.readLine();
  22.                 int colonna = 0;
  23.                 if(line == "")
  24.                     break;
  25.                 else if(line == null)
  26.                     break;
  27.                 line += "@";
  28.                 for(char a: line.toCharArray())
  29.                 {
  30.                     if(a == '|')
  31.                     {
  32.                         //Non fa niente
  33.                     }
  34.                     else if(a == '@')
  35.                     {
  36.                         riga++;
  37.                         colonna = 0;
  38.                     }
  39.                     else if(a == '-')
  40.                     {
  41.                         //Non fa niente
  42.                         break;
  43.                     }
  44.                     else if(a == '#')
  45.                     {
  46.                         terminate = true;
  47.                         break;
  48.                     }
  49.                     else
  50.                     {
  51.                         griglia[riga][colonna] = Integer.parseInt(Character.toString(a));
  52.                         colonna++;
  53.                     }
  54.                 }
  55.                 if(terminate == true)
  56.                     break;
  57.             }
  58.         }
  59.         catch (IOException e)
  60.         {
  61.             System.out.println("--> Error: "+ e.getMessage());
  62.         }  
  63.        
  64.     }
  65.     public boolean PresenteNumeroNellaRiga(int x, int riga)//Se il numero è presente nella riga ritorna true..
  66.     {
  67.         for(int a = 0;a <= 8;a++)
  68.         {
  69.             if(griglia_semplificata[riga][a] == x)
  70.                 return true;
  71.         }
  72.         return false;
  73.     }
  74.     public boolean PresenteNumeroNellaColonna(int x,int colonna)//Se il numero è presente nella colonna ritorna true..
  75.     {
  76.         for(int a = 0;a <= 8;a++)
  77.         {
  78.             if(griglia_semplificata[a][colonna] == x)
  79.                 return true;
  80.         }
  81.         return false;
  82.     }
  83.     public boolean PresenteNumeroNelQuadrante(int x,int riga, int colonna)//Se il numero è presente nel quadrante ritorna true..
  84.     {
  85.             int[] valoriDaSommareAllaRiga = new int[4];
  86.             int[] valoriDaSommareAllaColonna = new int[4];
  87.             valoriDaSommareAllaRiga[1]=0;
  88.             valoriDaSommareAllaColonna[1]=0;
  89.    
  90.             if(riga == 0 || riga == 3 || riga == 6)
  91.             {
  92.                 valoriDaSommareAllaRiga[2]=  1;
  93.                 valoriDaSommareAllaRiga[3]=  2;
  94.             }
  95.             if(riga == 1 || riga == 4 || riga == 7)
  96.             {
  97.                 valoriDaSommareAllaRiga[2]=  1;
  98.                 valoriDaSommareAllaRiga[3]= -1;
  99.             }
  100.             if(riga == 2 || riga == 5 || riga == 8)
  101.             {
  102.                 valoriDaSommareAllaRiga[2]= -1;
  103.                 valoriDaSommareAllaRiga[3]= -2;
  104.             }
  105.    
  106.             if(colonna == 0 || colonna == 3 || colonna == 6)
  107.             {
  108.                 valoriDaSommareAllaColonna[2]=  1;
  109.                 valoriDaSommareAllaColonna[3]=  2;
  110.             }
  111.             if(colonna == 1 || colonna == 4 || colonna == 7)
  112.             {
  113.                 valoriDaSommareAllaColonna[2]=  1;
  114.                 valoriDaSommareAllaColonna[3]= -1;
  115.             }
  116.             if(colonna == 2 || colonna == 5 || colonna == 8)
  117.             {
  118.                 valoriDaSommareAllaColonna[2]= -1;
  119.                 valoriDaSommareAllaColonna[3]= -2;
  120.             }
  121.             for(int a = 1; a <= 3; a++)
  122.             {
  123.                 for(int b = 1; b <= 3; b++)
  124.                 {
  125.                     if(griglia_semplificata[riga + valoriDaSommareAllaRiga[a]] [colonna + valoriDaSommareAllaColonna[b]] == x )
  126.                         return true;
  127.                 }
  128.             }
  129.    
  130.             return false;  
  131.     }
  132.     public boolean semplifica()
  133.     {
  134.         griglia_semplificata = griglia;
  135.         return risolvi();
  136.     }
  137.     public boolean risolvi()
  138.     {
  139.         int x = 0;//riga
  140.         int y = 0;//colonna
  141.         boolean spazio_libero = false;
  142.         int numeriAggiunti = 0;
  143.         for(int a = 0;spazio_libero == false && a <= 8;a++)
  144.         {
  145.             for(int b = 0;spazio_libero == false && b <= 8;b++)
  146.             {
  147.                 if(griglia_semplificata[a][b] == 0)
  148.                 {
  149.                     spazio_libero = true;
  150.                     x = a;
  151.                     y = b;
  152.                 }
  153.             }
  154.         }
  155.         if(spazio_libero == true)
  156.         {
  157.             for(int c = 1;c <= 9;c++)
  158.             {
  159.                 if(!PresenteNumeroNellaRiga(c,x) && !PresenteNumeroNellaColonna(c,y) && !PresenteNumeroNelQuadrante(c,x,y))
  160.                 {
  161.                     griglia_semplificata[x][y] = c;
  162.                     numeriAggiunti++;
  163.                     if(risolvi())
  164.                         return true;
  165.                     else
  166.                     {
  167.                         griglia_semplificata[x][y] = 0;
  168.                         numeriAggiunti--;
  169.                     }
  170.                 }
  171.             }
  172.             if(numeriAggiunti == 0)
  173.                 return false;
  174.         }
  175.         else
  176.         {
  177.             griglia = griglia_semplificata;
  178.             return true;
  179.         }
  180.         return true;
  181.     }
  182.     public void showSudoku()
  183.     {
  184.         int numero_di_colonna = 0;
  185.         for(int a = 0;a <= 8;a++)
  186.         {
  187.             if(a %3 == 0 && a != 0)
  188.                 System.out.print("\n");
  189.             for(int b = 0; b <= 8; b++)
  190.             {
  191.                 if(b %3 == 0 && b != 0)
  192.                     System.out.print("|");
  193.                 System.out.print(griglia[a][b]);
  194.             }
  195.             System.out.print("\n");
  196.         }  
  197.     }
  198. }
  199.  
  200. public class dochSudoku
  201. {
  202.     public static void main(String[] args)
  203.     {
  204.         sudoku sudo = new sudoku("provasu.txt");
  205.         if(sudo.semplifica()){
  206.             System.out.println("WIN, soluzione:");
  207.             sudo.showSudoku();
  208.         }else System.out.println("Il sudoku è irrisolvibile");
  209.     }
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement