Reputation: 23
I've been running into an issue. I'm relatively new at Java and am trying to bite off something a bit more complex than I'm used to. This is a combination of my own personal File input and main method with some cannibalized source for the other methods. I'm still fairly rusty with recursion. For some reason, the assignment command to change values in the 2D Array "board" is running through without errors, but not changing the value. Everything looks kosher to me in structure at least, but like I said, I'm new.
Also, I'm looking for text output over terminal with the finished program, and throwing an exception seems to just be an eyesore over terminal. Any suggestions?
import java.util.Scanner;
import java.io.File;
public class Sudoku2{
static int board[][] = new int[10][10] ;
static int backtrack = 0;
public static void main(String[] args) throws Exception {
Sudoku2 myPuzzle = new Sudoku2();
// myPuzzle.readboard();
myPuzzle.readData("./board/input.txt");
myPuzzle.solve(0, 0);
printboard();
}
protected static void printboard(){
System.out.println("Here's your puzzle: ");
for(int r = 0; r < 9; r++){
for(int c = 0; c < 9; c++){
System.out.print(board[r][c]+" ");
}
System.out.println("");
}
}
public void readData(String filename) {
File inputFile = new File(filename);
try {
Scanner keyboard = new Scanner(inputFile);
for (int row = 0; row < 9; row++) {
for (int col = 0; col < 9; col++) {
board[row][col] = keyboard.nextInt();
}
}
keyboard.close();
}catch(Exception e){
System.out.print("Problem in readFile" + e);
e.printStackTrace();
}
}
//check if valid in row
protected static boolean validInRow(int row, int value)
{
for( int col = 0; col < 9; col++ )
if( board[row][col] == value )
return false ;
return true ;
}
//check if valid in column
protected static boolean validInCol(int col, int value)
{
for( int row = 0; row < 9; row++ )
if( board[row][col] == value )
return false ;
return true ;
}
//check if valid in 3*3
protected static boolean validInBlock(int row, int col, int value)
{
row = (row / 3) * 3 ;
col = (col / 3) * 3 ;
for( int r = 0; r < 3; r++ )
for( int c = 0; c < 3; c++ )
if( board[row+r][col+c] == value )
return false ;
return true ;
}
//call other methods
public void solve(int row, int col) throws Exception
{
if(row > 8)
{
printboard();
throw new Exception("Solution found") ;
}
else
{
while(board[row][col] != 0)
{
if( ++col > 8 )
{
col = 0 ;
row++ ;
if( row > 8 )
printboard();
throw new Exception( "Solution found" ) ;
}
}
for(int value = 1; value < 10; value++)
{
if(validInRow(row,value) && validInCol(col,value) && validInBlock(row,col,value))
{
board[row][col] = value;
//new PrintEvent(board);
if( col < 8 )
solve(row, col + 1);
else
solve(row + 1, 0);
backtrack++;
}
}
board[row][col] = 0;
}
}
}
Upvotes: 2
Views: 1166
Reputation: 3855
Tenfour04's comment was correct. There is a missing bracket in one of your if-statements.
In your solve
method, the following code:
if ( row > 8 )
printboard();
throw new Exception( "Solution found" ) ;
should be changed to:
if ( row > 8 ) {
printboard();
throw new Exception( "Solution found" ) ;
}
In addition, as yourself mentioned, you are misusing Exception concept. Exception should be used for handling really exceptional, erroneous cases, not just for printing out something to the terminal.
You can simply use the System.out.println
method you used in the printboard
method something like the following:
if ( row > 8 ) {
printboard();
System.out.println( "Solution found" ) ;
return;
}
Here, I also added return
keyword to make the program exit the solve
method when a solution is found.
Hope this helps.
Upvotes: 1