Advertisement
Guest User

Untitled

a guest
Feb 16th, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.80 KB | None | 0 0
  1.  
  2. import java.util.ArrayList;
  3. import java.util.Scanner;
  4.  
  5. public class Main {
  6.  
  7.  
  8.     public static class SudokuSolver {
  9.  
  10.         private int[][] table;
  11.  
  12.         SudokuSolver() {
  13.             table = new int[9][9];
  14.         }
  15.  
  16.         public void Solve() {
  17.             if (RecursileSolve(table))
  18.                 printTable(table);
  19.             else
  20.                 System.out.println("Can't find solution");
  21.         }
  22.  
  23.         private boolean RecursileSolve(int[][] table) {
  24.             ArrayList<Integer> listOfPossibleValues;
  25.             ArrayList<Integer> minOfPossibleValues;
  26.             int minRow;
  27.             int minClm;
  28.             do {
  29.                 minOfPossibleValues = new ArrayList<>();
  30.                 minRow = 0;
  31.                 minClm = 0;
  32.                 for (int row = 0; row < 9; row++) {
  33.                     for (int clm = 0; clm < 9; clm++) {
  34.                         if (table[row][clm] != 0)
  35.                             continue;
  36.                         listOfPossibleValues = TryToFindValues(table, row, clm);
  37.                         if (listOfPossibleValues.size() == 0)
  38.                             return false;
  39.                         if (listOfPossibleValues.size() == 1)
  40.                             table[row][clm] = listOfPossibleValues.get(0);
  41.                         if (minOfPossibleValues.isEmpty() || minOfPossibleValues.size() > listOfPossibleValues.size()) {
  42.                             minOfPossibleValues = listOfPossibleValues;
  43.                             minRow = row;
  44.                             minClm = clm;
  45.                         }
  46.                     }
  47.                 }
  48.                 if (minOfPossibleValues.isEmpty())
  49.                     return true;
  50.             } while (minOfPossibleValues.size() <= 1);
  51.  
  52.             for (int e : minOfPossibleValues) {
  53.                 int[][] new_table = new int[9][9];
  54.                 for (int i = 0; i < 9; i++)
  55.                     System.arraycopy(table[i], 0, new_table[i], 0, 9);
  56.                 new_table[minRow][minClm] = e;
  57.                 if (RecursileSolve(new_table)) {
  58.                     for (int i = 0; i < 9; i++)
  59.                         System.arraycopy(new_table[i], 0, table[i], 0, 9);
  60.                     return true;
  61.                 }
  62.             }
  63.             return false;
  64.         }
  65.  
  66.  
  67.         private void findDifference(ArrayList<Integer> listOfValues, ArrayList<Integer> temp) {
  68.             for (int e : temp)
  69.                 if (listOfValues.contains(e))
  70.                     listOfValues.remove((Integer) e);
  71.         }
  72.  
  73.         private ArrayList<Integer> TryToFindValues(int[][] table_, int i, int j) {
  74.             ArrayList<Integer> listOfValues = new ArrayList<>();
  75.             for (int e = 0; e < 9; e++)
  76.                 listOfValues.add(e + 1);
  77.             findDifference(listOfValues, getRow(table_, j));
  78.             findDifference(listOfValues, getCml(table_, i));
  79.             findDifference(listOfValues, getBlock(table_, i, j));
  80.             return listOfValues;
  81.         }
  82.  
  83.         private ArrayList<Integer> getBlock(int[][] table_, int i, int j) {
  84.             ArrayList<Integer> temp = new ArrayList<>();
  85.             int blockRow = 3 * (i / 3);
  86.             int blockClm = 3 * (j / 3);
  87.             for (int row = blockRow; row < 3; row++)
  88.                 for (int clm = blockClm; clm < 3; clm++)
  89.                     temp.add(table_[row][clm]);
  90.             return temp;
  91.  
  92.         }
  93.  
  94.  
  95.         private ArrayList<Integer> getCml(int[][] table_, int i) {
  96.             ArrayList<Integer> temp = new ArrayList<>();
  97.             for (int clm = 0; clm < 9; clm++)
  98.                 temp.add(table_[i][clm]);
  99.             return temp;
  100.         }
  101.  
  102.  
  103.         private ArrayList<Integer> getRow(int[][] table_, int j) {
  104.             ArrayList<Integer> temp = new ArrayList<>();
  105.             for (int row = 0; row < 9; row++)
  106.                 temp.add(table_[row][j]);
  107.             return temp;
  108.         }
  109.  
  110.  
  111.         public void readTable() {
  112.             Scanner scanner = new Scanner(System.in);
  113.             for (int i = 0; i < 9; i++)
  114.                 for (int j = 0; j < 9; j++)
  115.                     if (scanner.hasNextInt())
  116.                         this.table[i][j] = scanner.nextInt();
  117.         }
  118.  
  119.         public void printTable(int[][] table) {
  120.             for (int i = 0; i < 9; i++) {
  121.                 for (int j = 0; j < 9; j++)
  122.                     System.out.print(table[i][j]);
  123.                 System.out.println();
  124.             }
  125.             System.out.println();
  126.         }
  127.  
  128.  
  129.     }
  130.  
  131.     public static void main(String[] args) {
  132.  
  133.         SudokuSolver ss = new SudokuSolver();
  134.         ss.readTable();
  135.         ss.Solve();
  136.  
  137.  
  138.     }
  139. }
  140.  
  141.  
  142. /*  000060700
  143.     059000000
  144.     010200000
  145.     000100000
  146.     600500000
  147.     300000460
  148.     000000000
  149.     000000091
  150.     800740000
  151.                 */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement