import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Sudoku{
//***************Definierar variabler************************
public int[][] matrix;
public boolean[][] change;
public int finalCol=8;
public int finalRow = 8;
public Sudoku(){
//Create matrix
matrix = new int[9][9];
change = new boolean[9][9];
}
//********Den rekursiva metoden för att lösa sodukot*******
public boolean solveNext(int row, int col) {
if(col == 9){
row++;
col = 0;
}
if(change[row][col]== false ){
return solveNext(row,col+1);
}
for(int k=1; k<=9;k++){ //testa tal 1-9 i varje ruta tills en som passar har hittas
matrix[row][col] = k;
if(chk(matrix,row,col)){
if(row==finalRow && col==finalCol){
return true;
}
if(solveNext(row,col+1)==true){ //Om matrisen uppfyller reglerna så ta ett steg fram
return true;
}
}
}
matrix[row][col] = -1;
return false;
}
//**Metod för att kontrollera om matrisen uppyller reglerna***
public boolean chk(int[][] matrix, int row, int col){
//**********Kontrollerar så den insatta siffran inte är en dublett***********
for(int i = 0; i<=8;i++){
if (matrix[row][i] == matrix[row][col] && i!=col && matrix[row][i]!=-1){
return false;
}
}
for(int i = 0; i<=8;i++){
if (matrix[i][col] == matrix[row][col] && i!=row && matrix[i][col]!=-1){
return false;
}
}
//******Metod för att kontollera om det finns dubletter i den specifika underkvadraten****
int tempRow=row;
int tempCol=col;
while(row % 3!=0){
row--;
}
while(col % 3 != 0){
col--;
}
for(int i = row; i<=row+2;i++){
for(int j=col; j<=col+2; j++)
if (matrix[tempRow][tempCol]==matrix[i][j] && matrix[i][j]!=-1 && (tempRow!= i && tempCol !=j)){
return false;
}
}
return true;
}
public int[][] getMatrix(){
return matrix;
}
public boolean[][] getChange(){
return change;
}
}