2013-10-06 3 views
2

문제점이 발생했습니다. 나는 비교적 Java에 익숙하지 않고 익숙한 것보다 좀 더 복잡한 것을 무언가를 물어 뜯기 위해 노력하고 있습니다. 이것은 내 자신의 개인적인 File 입력과 main 메소드가 다른 메소드에 대한 일부 식인 소스와 결합 된 것입니다. 나는 여전히 재귀와 함께 꽤 녹슬다. 어떤 이유로 인해 2D Array "보드"에서 값을 변경하는 할당 명령이 오류없이 실행되지만 값은 변경되지 않습니다. 모든 것 적어도 구조에 나에게 정결 한 것처럼 보입니다. 그러나 내가 말했던 것처럼, 나는 새롭습니다.Java Sudoku - 2D 배열에서 필드를 변경하지 않습니다.

또한 완성 된 프로그램으로 터미널을 통한 텍스트 출력을 찾고 예외를 throw하는 것이 터미널의 눈에 띄지 않는 것처럼 보입니다. 어떤 제안?

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에 자동 formating 옵션이 있어야합니다. – 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; 
} 

을, 나는 또한 해결책이 발견 될 때 프로그램 종료에게 solve 방법을 만들기 위해 return 키워드를 추가했다.

희망이 도움이됩니다.