2013-10-06 25 views
2

我已經運行到一個問題。我在Java方面相對比較新,並且正試圖咬掉一些比我以前更復雜的東西。這是我自己的個人文件輸入和主要方法與其他方法的一些破解源代碼的組合。遞歸我仍然很生疏。出於某種原因,用於更改2D陣列「板」中的值的賦值命令會無誤地運行,但不會更改該值。一切看起來猶太我在結構上至少,但就像我說的,我是新的。Java的數獨 - 不改變字段在二維數組

而且,我在尋找文本輸出端子上與完成的程序,並拋出一個異常,似乎只是在終端礙眼。有什麼建議麼?

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; 

     } 
    } 
} 
+0

你應該正確地格式化你的代碼,這是非常難以閱讀。你的IDE應該有一個自動格式化選項。 – TwoThe

+0

有一件事我注意到馬上是,你是不是你包圍if語句,但你以後他們中的一些縮進多次調用,這讓我覺得,也許你認爲這將讓他們的if語句的一部分。如果沒有括號,if語句只包含後面的單行。 – Tenfour04

+0

輸出異常是根本錯誤的。給solve()方法一個返回類型或讓它修改板,然後調用'printBoard()'。無論如何,你已經打印到System.out,所以我不明白這個問題的一部分。相反,有一些控制語句像'return;','break;' – clwhisk

回答

1

Tenfour04的評論是正確的。 if語句中有一個缺失的括號。 在你solve方法,下面的代碼:

if (row > 8) 
    printboard(); 
throw new Exception("Solution found") ; 

應改爲:

if (row > 8) { 
    printboard(); 
    throw new Exception("Solution found") ; 
} 

此外,如己提到,你是濫用例外的概念。 例外應該用於處理非常特殊的錯誤情況,而不僅僅是爲了向終端打印某些東西。

您可以簡單地使用你的printboard方法類似下面使用的System.out.println方法:

if (row > 8) { 
    printboard(); 
    System.out.println("Solution found") ; 
    return; 
} 

在這裏,我還添加了return關鍵字來使程序退出solve方法時,找到解決辦法。

希望這會有所幫助。