Anda di halaman 1dari 10

import java.util.

Scanner;

public class Sudoku {

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

public static void main(String[]args){

Scanner scan=new Scanner(System.in);//create a scanner.

boolean allawedVal[]=new boolean[9];//pinakas gia apothkevsi stixiwn p epistrefi i methodos getAllowedValues.

int row,col,timi;

reset();//midenismos olwn twn thesewn tou board.

InitializeBoard();//arxikopioisi timwn p o xristis DEN mpori na allaksi.

System.out.println("Sudoku Game:");

System.out.print("the puzzle is: \n"+print());//ektipwsi arxiku pinaka.

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)");

answer=scan.next().charAt(0);//isagwgi epilogis xristi.

while (answer!='q'){// enoso o xristis DEN dwsi 'q'=Quit tote to loop ektelite.
switch (answer){//elegxos isagwgis xristi.

case 'c':{reset();//an epileksi 'c'=Clear, o pinakas ksanaarxikopioite

InitializeBoard();

System.out.print("the puzzle is now: \n"+print());//kai tipwnete.

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;

System.out.println("What should the value (1-9) be?");

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();

addGuess(row, col, timi);//theti ti timi p epele3e o xristis sto dedomeno keli.


System.out.print("the puzzle is now: \n"+print());//ektiposi puzzle.

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.

row = scan.nextInt() - 1;//epilogi grammis

col = scan.nextInt() - 1;//epilogi stilis

allawedVal=getAllowedValues(row,col);//i pi8anes times t dedomenou keliu antistixun sti thesis t pinaja allawesVal kai exun timi true,enw i ipolipes false

System.out.print("Allowed values are: ");

for(int i = 0; i <=8; i++)

if(allawedVal[i])

System.out.printf("%d ",i);//ektiposi pi8anwn timwn dedomenu keliou.

System.out.println();

System.out.print("the puzzle is now: \n"+print());//ektiposi puzzle.

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.

System.out.println("You have made an error in the puzzle.");//minima la8us.


else

if(isFull())//elegxos gia gemisma olu tou puzzle nwoumenu oti den paraviazonte oi kanonismoi.dini true an o pinakas einai gematos.

System.out.println("Congratulations,you have completed the puzzle correctly! You win!");//minima nikis.

System.out.println("What would you like to do? \n Clear Puzzle(C) Set a square (S) Get possible values (G) Quit (Q)");

answer=scan.next().charAt(0);//isagwgi epilogis apo xristi.

System.out.println("Thanks for playing.\n");//an o xristis epileksi 'q'=Quit tote to loop termatizete k tiponete minima termatismu.

System.out.print("the puzzle is now: \n"+print()); //ektiposi puzzle.

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);

}//arxikopioisi timwn p den mpori o xristis na allaksi.

public static String print(){//ektiposi pinaka se string.

String table="Row/Col\n 1 2 3 4 5 6 7 8 9\n----------------------\n";

for (int r=0; r<board.length; r++){//enwsi timwn t pinaka se ena string

table=table+(r+1)+" |";

for (int c=0; c<board.length; c++){


if (board[r][c]==0)//an t dedomeno keli exi t timi miden tiponi telia '.'

table=table+". ";

else

table=table+board[r][c]+" ";

table=table+"\n";

return table;//epistrefi t string p 8a tipo8i.

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;

for (int i=0; i<check.length; i++)

check[i]=0;//arxikopioisi pinaka

for (int r=0; r<board.length; r++) {//elegxos grammis.

for (int c=0; c<board.length; c++)

check[board[r][c]]++;

for (int i=1; i<check.length; i++)

if (check[i]>1)//an i timi ts 8esis parusiazete panw apo 1 fora tote paraviazonte oi kanones t sudoku

flag=false;

for (int i=0; i<check.length; i++)

check[i]=0;//epanafero t pinaka stin arxiki t katastasi wste na mporo na ton ksanaxrisimopioisw.

for (int c=0; c<board.length; c++){//elegxos stilis.

for (int r=0; r<board.length; r++)

check[board[r][c]]++;

for (int i=1; i<check.length; i++)

if (check[i]>1)//an i timi ts 8esis parusiazete panw apo 1 fora tote paraviazonte oi kanones t sudoku
flag=false;

for (int i=0; i<check.length; i++)

check[i]=0;//epanafero t pinaka stin arxiki t katastasi wste na mporo na ton ksanaxrisimopioisw.

for (int r=0; r<9; r+=3)//elegxos ka8e block 3*3 t pinaka board.

for (int c=0; c<9; c+=3){

for (int a=r; a<=r+2; a++)

for (int b=c; b<=c+2; b++)

check[board[a][b]]++;

for (int i=1; i<check.length; i++)

if (check[i]>1)//an i timi ts 8esis parusiazete panw apo 1 fora tote paraviazonte oi kanones t sudoku

flag=false;

for (int i=0; i<check.length; i++)

check[i]=0;//epanafero t pinaka stin arxiki t katastasi wste na mporo na ton ksanaxrisimopioisw.

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.

for (int r=0; r<board.length; r++)

for (int c=0; c<board.length; c++)

if (board[r][c]==0)

return false;

return true;

public static void reset(){//gemizi t puzzleme midenika g na ton arxikopioisume sti sinexia.

for (int r=0; r<board.length; r++)

for (int c=0; c<board.length; c++)

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];

for (int val=1; val<10; val++){

board[r][c]=val;

possibleValue[val]=CheckPuzzle();//elegxo g pies times den paraviazonte oi kanonismoi.


}

board[r][c] = tmp;//epanafero t keli stin arxiki timi t.

return possibleValue;

Anda mungkin juga menyukai