Scanner;
public static int board[][]=new int[9][9];//dilosi pinakwn wste na anagnwrizonte apo oles tis me8odus.
public static boolean start[][]=new boolean[9][9];//o pinakas start exi true stis thesis opu oi arxikes times t board den mporun na allaksun
int row,col,timi;
System.out.println("Sudoku Game:");
char answer;
System.out.println("What would you like to do? \n Clear Puzzle(C) Set a square (S) Get possible values (G) Quit (Q)");
while (answer!='q'){// enoso o xristis DEN dwsi 'q'=Quit tote to loop ektelite.
switch (answer){//elegxos isagwgis xristi.
InitializeBoard();
break;
case 's':{System.out.println("Which row (1-9) and colume (1-9) do you want to change?");//an epileksi o xristis 's'=Set tote dini t grammi,stili,k timi.
row=scan.nextInt()-1;
col=scan.nextInt()-1;
while ((((row>8) || (row<0)) || (col>8)) || (col<0)){//enoso i times p dini o xristis einai ektos twn epi8imitwn oriwn ksanazita nea apilogi grammis
k stilis.
System.out.println("Wrong values!\nWhich row (1-9) and column (1-9) do you want to change?");
row=scan.nextInt()-1;
col=scan.nextInt()-1;
timi=scan.nextInt();
while ((timi<0) || (timi>9)){//enoso i timi p dini o xristis den aniki st diastima 1-9 ksanazita nea timi.
System.out.print("Wrong value! Value must be 1-9! What should the value (1-9) be?");
timi=scan.nextInt();
break;
case 'g':{System.out.println("Which row (1-9) and column (1-9) do you want to get values for?");//an o xristis epile3i 'g'=Get tote parusiazonte oi
pi8anes times g t dedomeno keli p epelekse o xristis.
allawedVal=getAllowedValues(row,col);//i pi8anes times t dedomenou keliu antistixun sti thesis t pinaja allawesVal kai exun timi true,enw i ipolipes false
if(allawedVal[i])
System.out.println();
break;
default:{System.out.print("Wrong answer!\n");//an o xristis dwsi allo xaraktira ektos apo 'q','s','g','c' tote tiponete minima la8us.
break;
if(!CheckPuzzle())//elegxos gia timi i opia paraviazi tus kanonismus tou pexnidiou.dini true an den paraviazonte.
if(isFull())//elegxos gia gemisma olu tou puzzle nwoumenu oti den paraviazonte oi kanonismoi.dini true an o pinakas einai gematos.
System.out.println("What would you like to do? \n Clear Puzzle(C) Set a square (S) Get possible values (G) Quit (Q)");
System.out.println("Thanks for playing.\n");//an o xristis epileksi 'q'=Quit tote to loop termatizete k tiponete minima termatismu.
public static void InitializeBoard(){//kali tn me8odo AddInitial dinontas rita t grammi t stili k tin timi arxikopioisis tou dedomenu keliu.
AddInitial(0,0,1);
AddInitial(0,1,2);
AddInitial(0,2,3);
AddInitial(0,3,4);
AddInitial(0,4,9);
AddInitial(0,5,7);
AddInitial(0,6,8);
AddInitial(0,7,6);
AddInitial(0,8,5);
AddInitial(1,0,4);
AddInitial(1,1,5);
AddInitial(1,2,9);
AddInitial(2,0,6);
AddInitial(2,1,7);
AddInitial(3,0,3);
AddInitial(4,0,2);
AddInitial(5,0,9);
AddInitial(5,5,5);
AddInitial(6,0,8);
AddInitial(7,0,7);
AddInitial(8,0,5);
AddInitial(8,3,9);
table=table+(r+1)+" |";
table=table+". ";
else
table=table+board[r][c]+" ";
table=table+"\n";
public static void AddInitial(int row,int col,int value){//arxikopioisi timwn.sto dedomeni keli vazi ti sigkekrimeni timi.
board[row][col]=value;
start[row][col]=true;//oi 8esis t pinaka board p arxikopiounte antistixun stis 8esis t pinaka start k ginonte true.
public static void addGuess(int r,int c,int val){//an st keli p 8eli na 8esi timi o xristis timi den einai keli arxikopioimeno tote vazume ti timi st dedomeno keli.
if (!start[r][c])
board[r][c]=val;
public static boolean CheckPuzzle(){//elegxos grammis,stilis,blocks 3*3.an oi times paraviaun tous kanonismus epistrefi false.
int check[]=new int[10];//orizw pinaka k xrisimopiw tis 8esis 1-9 g na elegksw poses fores emfanizete o ka8e ari8mos 8esis.
boolean flag=true;
check[i]=0;//arxikopioisi pinaka
check[board[r][c]]++;
if (check[i]>1)//an i timi ts 8esis parusiazete panw apo 1 fora tote paraviazonte oi kanones t sudoku
flag=false;
check[board[r][c]]++;
if (check[i]>1)//an i timi ts 8esis parusiazete panw apo 1 fora tote paraviazonte oi kanones t sudoku
flag=false;
for (int r=0; r<9; r+=3)//elegxos ka8e block 3*3 t pinaka board.
check[board[a][b]]++;
if (check[i]>1)//an i timi ts 8esis parusiazete panw apo 1 fora tote paraviazonte oi kanones t sudoku
flag=false;
return flag;
public static int getValue(int row,int col){//epistrefi ti timi kapiou dedomenu keliou.
return board[row][col];
}
public static boolean isFull(){//elegxi an iparxun kelia me ti timi 0.an oxi epistrefi true.
if (board[r][c]==0)
return false;
return true;
public static void reset(){//gemizi t puzzleme midenika g na ton arxikopioisume sti sinexia.
board[r][c]=0;
public static boolean[] getAllowedValues(int r, int c){//epistrefi tis times p mpori na exi ena keli p epilegi o xristis.
boolean possibleValue[]=new boolean[10];//an einai pi8ani timi o ari8mos tis ka8e 8esis t pinaka (1-9) 8a perni timi true.
int tmp=board[r][c];
board[r][c]=val;
return possibleValue;