Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- import java.util.*;
- public class Sudoku {
- public static int[][] sudokuInDigits = new int[9][9]; //matricata kydeto se pazi sudokuto
- private static boolean solved = false;//uslovie za izlizane ot rekursiqta
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- String[][] sudoku = new String[9][9];
- int placesToFill = 0;
- for (int i = 0; i < sudoku.length; i++) {
- for (int j = 0; j < 1; j++) {
- sudoku[i][j] = in.next();
- for (int k = 0; k < 9; k++) {
- //prevryshtane ot String kym int na vxoda
- if (sudoku[i][k] != "-") {
- int digit = sudoku[i][j].charAt(k) - '0';
- if (digit > 0) {
- sudokuInDigits[i][k] = digit;
- }
- else {
- //dynoto na rekursiqta
- placesToFill++;
- }
- }
- }
- }
- }
- solveSudoku(placesToFill, 0);
- //printirane na gotovoto sudoku
- for (int i = 0; i < sudokuInDigits.length; i++) {
- for (int j = 0; j < sudokuInDigits[i].length; j++) {
- System.out.print(sudokuInDigits[i][j]);
- }
- System.out.println();
- }
- }
- private static void solveSudoku(int squaresLeft, int nextNumber) {
- if (squaresLeft == 0 || solved) {
- solved = true;
- return;
- }
- for (int i = 0; i < sudokuInDigits.length; i++) {
- for (int j = 0; j < sudokuInDigits[i].length; j++) {
- //obxojdane na matricata za da vidim kyde lipsvat chisla
- if (sudokuInDigits[i][j] == 0) {
- for (int k = 1; k < 10; k++) {
- //proverki za tova koe chislo lipsva i koe se sydyrja na syotvetniq red/kolona
- //ili kvadratche
- if (checkRow(k,i) == true && checkColumn(j,k) == true
- && checkSquare(i,k,j) == true) {
- sudokuInDigits[i][j] = k;
- squaresLeft--;
- solveSudoku(squaresLeft,k + 1);
- //neobxodimo za da moje da kato se vryshta rekursiqta
- //da ne promenq tekushtoto systoqnie
- if(solved)
- return;
- //pri otkriti konflikti vyzstanovqvame predishnoto systoqnie
- //na matricata
- sudokuInDigits[i][j] = 0;
- squaresLeft++;
- }
- }
- return;
- }
- }
- }
- return;
- }
- private static boolean checkRow(int candidate, int row) {
- //proverka za reda dali sydyrjda chisloto
- for (int col = 0; col < 9; col++ ) {
- if (sudokuInDigits[row][col] == candidate)
- return false;
- }
- return true;
- }
- private static boolean checkColumn(int column, int candidate) {
- //proverka za kolonata dali sydyrja chisloto
- for (int row = 0; row < 9; row++ ) {
- if (sudokuInDigits[row][column] == candidate)
- return false;
- }
- return true;
- }
- private static boolean checkSquare(int row, int candidate, int column) {
- //izchisleniq za tova kakvo e razstoqnieto ot [0,0] do [row,column]
- int colMultiplier = column / 3;
- int rowMultiplier = row / 3;
- int cellsInASquareSide = 3;
- //proverka na kvadratcheto
- for (int i = 0; i < 9; i++) {
- if (sudokuInDigits[i % 3 + rowMultiplier * cellsInASquareSide][i / 3 +
- colMultiplier * cellsInASquareSide] == candidate) {
- return false;
- }
- }
- return true;
- }
- }
Add Comment
Please, Sign In to add comment