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;
}
}
}
你應該正確地格式化你的代碼,這是非常難以閱讀。你的IDE應該有一個自動格式化選項。 – TwoThe
有一件事我注意到馬上是,你是不是你包圍if語句,但你以後他們中的一些縮進多次調用,這讓我覺得,也許你認爲這將讓他們的if語句的一部分。如果沒有括號,if語句只包含後面的單行。 – Tenfour04
輸出異常是根本錯誤的。給solve()方法一個返回類型或讓它修改板,然後調用'printBoard()'。無論如何,你已經打印到System.out,所以我不明白這個問題的一部分。相反,有一些控制語句像'return;','break;' – clwhisk