462,230 Members | 669 Online Need help? Post your question and get tips & solutions from a community of 462,230 IT Pros & Developers. It's quick & easy.

# help!! Solving Sudoku via recursion and backtracking

 P: 4 Hello, I'm trying to build a program that solves sudokus and prints out the result on the screen. Here's the code for the class SudokuBoard. this will later be called in a class Sudoku. I'm a newbie, so making this took me hours and hours of time... Expand|Select|Wrap|Line Numbers // class SudokuBoard, will be called by class Sudoku   import java.util.Scanner; import java.io.*;   public class SudokuBoard {       private int[][] board = new int;       // it reads the established sudoku board from a scanner, which        will be given when the class Sudoku calls upon the  method.     public void readBoardFromScanner(Scanner s) {       for (int i=0; i<9; i++)          for (int j=0; j<9;j++)          board[i][j] = s.nextInt();                        }       public void printBoard() {       System.out.println("The Board is:");       for(int i=0; i<9; i++){         for (int j=0; j<9; j++){           System.out.print(board[i][j]+" ");          }         System.out.println(" ");     }       }  // checks the row to see if a given # is okay     public boolean rowCheck(int i, int number) throws Exception {       for (int j = 0; j < 9 ; j++)         if (board[i][j] == number )         return false;       return true;     } // checks the column to see if a given # is okay     public boolean columnCheck(int j, int number) throws Exception {       for (int i = 0; i < 9; i++)         if (board[i][j] == number )         return false;       return true;     } // checks the 3*3 box to see if a given # is okay     public boolean smallBoxCheck(int i, int j, int number) throws Exception {        int k = (i/3);     int l = (j/3);       int row = k * 3;     int col = l * 3;        // the above steps are for round-offs so that i=6,7,8 can start     // altogether with row starting point 6, i=4,5,6 with row starting     // point 4, etc. Same logic with columns.        for (int x = 0; x < 3; x++)         for (int y = 0; y < 3; y++)         if(board[row+x][col+y] == number )             return false;       return true;     } // the active part begins here     public void solve(int i, int j) throws Exception {       if ( i > 8 )         throw new Exception ( "Solution Found" ) ;     else         {             while( board[i][j] != 0 ) {                  if ( ++j > 8 )               {                                          j = 0;                              i ++;                                           if ( i > 8 )                      throw new Exception ("Solution Found");               }         }               for (int num = 1; num < 10; num++) {                             if (columnCheck(i,num) && rowCheck(i,num) && smallBoxCheck(i,j,num)) {             board[i][j] = num;   // after setting the number, call the next recursive call             if ( j < 8 )                 solve( i, j+1);             else                  solve (i+1, 0);             }         }   // no solutions found, set the spot to 0 and backtrack         board[i][j] = 0;                     }     }   // Start solving at 0,0     public void startSolve() {     try {         solve(0,0);     }       catch (Exception exception )         { }     } }     and then, here is the call from the class Sudoku :   import java.io.*; import java.util.Scanner;   public class Sudoku {       public static void main (String[] args) throws FileNotFoundException {       Scanner text;     text = setFileScanner("board1");       SudokuBoard sb = new SudokuBoard();       sb.readBoardFromScanner(text);       sb.printBoard(); // print the original board       sb.startSolve(); // solve the board       sb.printBoard(); // supposed to print the "solved" board       }       public static Scanner setFileScanner(String fileName) throws FileNotFoundException {           File randomName = new File(fileName);         Scanner t = new Scanner(randomName);         return t;     }   }   Okay, now, the second sb.printBoard(); still gives me the original board on the screen. I don't really understand what I did wrong, but it seems that none of the "solution" numbers are replacing the zeroes(blanks) within the original board. What am I doing wrong here? Thank you so much. Dec 11 '08 #1 