문제점이 발생했습니다. 나는 비교적 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;
}
}
}
코드를 올바르게 형식화해야합니다. 읽기가 매우 어렵습니다. 귀하의 IDE에 자동 formating 옵션이 있어야합니다. – TwoThe
내가 알아 차린 단 한가지 사실은 if 문을 대괄호로 묶지는 않았지만 그 중 일부 뒤에 여러 번 들여 쓰기를했기 때문에 if 문에서 해당 문을 일부로 사용한다고 생각하게 만드는 것입니다. 대괄호가없는 경우 if 문은 그 다음에 나오는 한 행만 포함합니다. – Tenfour04
예외를 출력으로 던지는 것은 기본적으로 잘못되었습니다. 'solve()'메소드에 리턴 타입을 주거나 보드를 수정 한 다음'printBoard()'를 호출하십시오. 어쨌든 System.out에 이미 인쇄 중이므로 그 부분을 이해하지 못합니다. 대신'return;','break;'와 같은 제어 문이 있습니다. – clwhisk