Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.Arrays;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.Set;
- public class Sudoku {
- private static final int SIZE = 9;
- private static final int CELL = 3;
- private static Set<Integer> all;
- private static Set<Integer> cell;
- private Set<Integer> mnozina1;
- // public static int sudoku[][] = {
- // {0,3,0, 8,0,0, 0,0,0},
- // {9,0,5, 6,0,0, 7,0,0},
- // {0,0,1, 0,9,3, 2,0,0},
- //
- // {8,0,6, 5,0,0, 0,0,0},
- // {0,4,0, 0,3,0, 0,0,0},
- // {0,0,0, 0,0,0, 0,0,0},
- //
- // {4,0,2, 3,0,6, 9,5,0},
- // {0,1,9, 0,8,0, 0,6,0},
- // {3,0,8, 2,0,9, 0,1,0},
- // };
- // public static int sudoku[][] = {
- // {4,7,2, 0,0,0, 0,0,0},
- // {1,0,5, 7,6,0, 0,0,4},
- // {0,0,0, 0,0,0, 0,0,0},
- //
- // {0,0,0, 0,8,0, 0,0,0},
- // {0,4,7, 2,0,0, 0,0,0},
- // {8,3,0, 4,0,1, 0,0,2},
- //
- // {5,8,0, 0,2,0, 0,7,0},
- // {0,0,0, 3,0,8, 0,2,9},
- // {0,0,4, 0,7,0, 0,1,0},
- //};
- public static int sudoku[][] = {
- {0,6,2, 0,7,0, 0,0,0},
- {0,0,0, 0,0,0, 0,0,0},
- {0,4,0, 6,9,1, 0,7,0},
- {8,0,1, 0,2,9, 6,0,0},
- {0,9,0, 0,0,7, 8,0,0},
- {0,0,0, 0,6,3, 5,0,0},
- {3,0,0, 0,0,0, 0,0,0},
- {0,2,7, 0,0,0, 0,6,0},
- {0,1,0, 0,5,0, 0,4,0},
- };
- public Sudoku(){
- all = new HashSet<Integer>();
- cell = new HashSet<Integer>();
- cell.add(0);cell.add(1);cell.add(2);
- for(int i = 1; i < 10; i++)
- all.add(i);
- mnozina1 = new HashSet<Integer>();
- }
- //cislo bunky
- //prejst vsetky riadky okrem aktualneho
- //ak najde cislo v len jednom riadku zistit bunku kde chyba
- //skontrolovat vsety stlpce a zistit ci je len jeden kde moze byt dane cislo
- //dopisat cislo a opakovat pre stlpce - riadky
- public void printSudoku(){
- System.out.println("-----------");
- for (int y = 0; y < SIZE; y++){
- for(int x = 0; x < SIZE; x++){
- System.out.print(sudoku[y][x]);
- if(x==2 || x==5)
- System.out.print(" ");
- }
- System.out.println();
- if(y==2 || y==5)
- System.out.println();
- }
- }
- /*private int searchBunka(int sudoku[][], int cislo){
- }*/
- public int[][] solveSudoku(){
- Set<Integer> temp;
- int[][] polePredtym;
- Iterator<Integer> iterator;
- for(int i = 0; i < SIZE*SIZE; i++){
- polePredtym = sudokuCopy();
- for(int y = 0; y < SIZE; y++){
- for(int x = 0; x < SIZE; x++){
- if(sudoku[y][x] == 0){
- temp = new HashSet<Integer>(all);
- temp.removeAll(getMnozina1(x, y));
- if(temp.size() == 1){
- iterator = temp.iterator();
- sudoku[y][x] = iterator.next();
- }
- }
- // if(sudoku[y][x] == 0){
- // sudoku[y][x] = solveRowColum(x, y);
- // }
- }
- }
- if(Arrays.deepEquals(polePredtym, sudoku)){
- if(isSolved())
- System.out.printf("Suroku vyriesene pri %d prechode.\n", i);
- else
- System.out.println("Suroku nevyriesene.");
- return sudoku;
- }
- }
- System.out.println("Suroku nevyriesene.");// rozmysliet odstranenie
- return sudoku;
- }
- private int[][] sudokuCopy(){
- int copy[][] = new int[SIZE][SIZE];
- for(int i = 0; i < SIZE; i++){
- for(int j = 0; j < SIZE; j++){
- copy[i][j] = sudoku[i][j];
- }
- }
- return copy;
- }
- /*private int solveOne(int sudoku[][], int x, int y){
- }*/
- private Set<Integer> getMnozina1(int x, int y){
- mnozina1.clear();
- for(int i = 0; i < SIZE; i++)
- mnozina1.add(sudoku[y][i]);
- for(int i = 0; i < SIZE; i++)
- mnozina1.add(sudoku[i][x]);
- int cellNumb[] = getCellNumb(x, y);
- for(int i = cellNumb[1]*CELL; i<cellNumb[1]*CELL+CELL; i++)
- for(int j = cellNumb[0]*CELL; j<cellNumb[0]*CELL+CELL; j++)
- mnozina1.add(sudoku[i][j]);
- mnozina1.remove(0);
- return mnozina1;
- }
- private Set<Integer> getMnozina2(int realX, int realY){
- Set<Integer> mnozinaR1 = new HashSet<Integer>();
- Set<Integer> mnozinaR2 = new HashSet<Integer>();
- Set<Integer> mnozinaRS = new HashSet<Integer>();
- Set<Integer> mnozinaS1 = new HashSet<Integer>();
- Set<Integer> mnozinaS2 = new HashSet<Integer>();
- Set<Integer> row = new HashSet<Integer>(cell);
- Set<Integer> column = new HashSet<Integer>(cell);
- int x = realX, y = realY;
- while(x > 2)
- x -= CELL;
- while(y > 2)
- y -= CELL;
- int cellNumb[] = getCellNumb(x, y);
- row.remove(y);
- column.remove(x);
- Iterator<Integer> iRow, iColumn;
- iRow = row.iterator();
- int y1Row = iRow.next(), y2Row = iRow.next();
- iColumn = column.iterator();
- int x1Column = iColumn.next(), x2Column = iColumn.next();
- for(int i = 0; i < SIZE; i++){
- mnozinaR1.add(sudoku[y1Row+cellNumb[1]*CELL][i]);
- mnozinaS1.add(sudoku[i][x1Column+cellNumb[0]*CELL]);
- mnozinaRS.add(sudoku[realY][i]);
- mnozinaRS.add(sudoku[i][realX]);
- mnozinaR2.add(sudoku[y2Row+cellNumb[1]*CELL][i]);
- mnozinaS2.add(sudoku[i][x2Column+cellNumb[0]*CELL]);
- }
- for(int i = cellNumb[1]*CELL; i<cellNumb[1]*CELL+CELL; i++)
- for(int j = cellNumb[0]*CELL; j<cellNumb[0]*CELL+CELL; j++)
- mnozinaRS.add(sudoku[i][j]);
- mnozinaR1.retainAll(mnozinaR2);
- mnozinaS1.retainAll(mnozinaS2);
- mnozinaR1.retainAll(mnozinaS1);
- mnozinaR1.removeAll(mnozinaRS);
- mnozinaR1.remove(0);
- return mnozinaR1;
- }
- private int solveRowColum(int x, int y){
- Set<Integer> mnozinaRiadky = getRows(x, y, true);
- Set<Integer> mnozinaStlpce = getColumns(x, y, false);
- Set<Integer> mnozinaBunka = getCell(x, y);
- mnozinaRiadky.retainAll(mnozinaStlpce);
- mnozinaRiadky.removeAll(mnozinaBunka);
- mnozinaRiadky.remove(0);
- if(mnozinaRiadky.size() == 1){
- return (Integer)(mnozinaRiadky.toArray()[0]);
- }
- else{
- mnozinaRiadky = getRows(x, y, false);
- mnozinaStlpce = getColumns(x, y, true);
- mnozinaStlpce.retainAll(mnozinaRiadky);
- mnozinaStlpce.removeAll(mnozinaBunka);
- mnozinaStlpce.remove(0);
- if(mnozinaStlpce.size() == 1){
- return (Integer)(mnozinaStlpce.toArray()[0]);
- }
- else
- return 0;
- }
- }
- private Set<Integer> getRows(int x, int y, boolean all){
- boolean realyAll = all;
- Set<Integer> rowPos = getNextRowPos(x, y);
- Set<Integer> rowNumbs1 = new HashSet<Integer>();
- Set<Integer> rowNumbs2 = new HashSet<Integer>();
- Iterator<Integer> iter = rowPos.iterator();
- int row1 = iter.next(), row2 = iter.next();
- if(sudoku[row1][x] != 0 && sudoku[row2][x] != 0)
- realyAll = true;
- for(int i = 0; i < SIZE; i++){
- if(realyAll){
- rowNumbs1.add(sudoku[row1][i]);
- rowNumbs2.add(sudoku[row2][i]);
- }
- else{
- if(sudoku[row1][x] == 0)
- rowNumbs1.add(sudoku[row1][i]);
- if(sudoku[row2][x] == 0)
- rowNumbs2.add(sudoku[row2][i]);
- }
- }
- if(realyAll){
- rowNumbs1.retainAll(rowNumbs2);
- return rowNumbs1;
- }
- else{
- if(sudoku[row1][x] == 0){
- return rowNumbs1;
- }
- else{
- return rowNumbs2;
- }
- }
- }
- private Set<Integer> getColumns(int x, int y, boolean all){
- boolean realyAll = all;
- Set<Integer> columnPos = getNextColumnPos(x, y);
- Set<Integer> columnNumbs1 = new HashSet<Integer>();
- Set<Integer> columnNumbs2 = new HashSet<Integer>();
- Iterator<Integer> iter = columnPos.iterator();
- int column1 = iter.next(), column2 = iter.next();
- if(sudoku[y][column1] != 0 && sudoku[y][column2] != 0)
- realyAll = true;
- for(int i = 0; i < SIZE; i++){
- if(realyAll){
- columnNumbs1.add(sudoku[i][column1]);
- columnNumbs2.add(sudoku[i][column2]);
- }
- else{
- if(sudoku[y][column1] == 0)
- columnNumbs1.add(sudoku[i][column1]);
- if(sudoku[y][column2] == 0)
- columnNumbs2.add(sudoku[i][column2]);
- }
- }
- if(realyAll){
- columnNumbs1.retainAll(columnNumbs2);
- return columnNumbs1;
- }
- else{
- if(sudoku[y][column1] == 0){
- return columnNumbs1;
- }
- else{
- return columnNumbs2;
- }
- }
- }
- private Set<Integer> getCell(int x, int y){
- int cellPos[] = getCellNumb(x, y);
- Set<Integer> cellNumbs = new HashSet<Integer>();
- for(int i = cellPos[1]*CELL; i < cellPos[1]*CELL+CELL; i++)
- for(int j = cellPos[0]*CELL; j < cellPos[0]*CELL+CELL; j++)
- cellNumbs.add(sudoku[i][j]);
- return cellNumbs;
- }
- private Set<Integer> getNextInRow(int x, int y){
- Set<Integer> rowPos = getNextRowPos(x, y);
- Set<Integer> nextRowNumbs = new HashSet<Integer>();
- Iterator<Integer> iter = rowPos.iterator();
- int row1 = iter.next(), row2 = iter.next();
- nextRowNumbs.add(sudoku[y][row1]);
- nextRowNumbs.add(sudoku[y][row2]);
- nextRowNumbs.remove(0);
- return nextRowNumbs;
- }
- private Set<Integer> getNextInColumn(int x, int y){
- Set<Integer> columnPos = getNextRowPos(x, y);
- Set<Integer> nextColumnNumbs = new HashSet<Integer>();
- Iterator<Integer> iter = columnPos.iterator();
- int column1 = iter.next(), column2 = iter.next();
- nextColumnNumbs.add(sudoku[column1][x]);
- nextColumnNumbs.add(sudoku[column2][x]);
- nextColumnNumbs.remove(0);
- return nextColumnNumbs;
- }
- private Set<Integer> getNextRowPos(int x, int y){
- int cellNumb[] = getCellNumb(x, y);
- Set<Integer> rowPos = new HashSet<Integer>();
- for(int i = cellNumb[1]*CELL; i < cellNumb[1]*CELL+CELL; i++){
- if(i == y)
- continue;
- rowPos.add(i);
- }
- return rowPos;
- }
- private Set<Integer> getNextColumnPos(int x, int y){
- int cellNumb[] = getCellNumb(x, y);
- Set<Integer> columnPos = new HashSet<Integer>();
- for(int i = cellNumb[0]*CELL; i < cellNumb[0]*CELL+CELL; i++){
- if(i == x)
- continue;
- columnPos.add(i);
- }
- return columnPos;
- }
- private int[] getCellNumb(int x, int y){
- int cell[] = {x,y};
- if(cell[0] < 3)
- cell[0] = 0;
- else if(cell[0] < 6)
- cell[0] = 1;
- else
- cell[0] = 2;
- if(cell[1] < 3)
- cell[1] = 0;
- else if(cell[1] < 6)
- cell[1] = 1;
- else
- cell[1] = 2;
- return cell;
- }
- private boolean isSolved(){
- for(int y = 0; y < SIZE; y++)
- for(int x = 0; x < SIZE; x++)
- if(sudoku[y][x] == 0)
- return false;
- return true;
- }
- private void print(Set<Integer> set){
- for(Iterator<Integer> i = set.iterator(); i.hasNext();){
- System.out.print(i.next() + " ");
- }
- System.out.println();
- }
- public static void main(String args[]){
- Sudoku sud = new Sudoku();
- long stop, start = System.currentTimeMillis();
- sud.solveSudoku();
- sud.printSudoku();
- stop = System.currentTimeMillis();
- System.out.printf("Doba riesenia: %dms\n", stop-start);
- // sud.printSudoku();
- // sud.print(sud.getCell(3, 0));
- System.out.println(sud.solveRowColum(8, 7));
- }
- }
Add Comment
Please, Sign In to add comment