gpt4 book ai didi

Java 数独 - 不更改二维数组中的字段

转载 作者:行者123 更新时间:2023-11-30 11:27:44 26 4
gpt4 key购买 nike

我遇到了一个问题。我是 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;

}
}
}

最佳答案

Tenfour04 的评论是正确的。您的一个 if 语句中缺少一个括号。在您的 solve 方法中,以下代码:

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

应该改为:

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

此外,正如您自己提到的,您误用了 Exception 概念。Exception 应该用于处理真正异常的错误情况,而不仅仅是将某些内容打印到终端。

您可以简单地使用您在 printboard 方法中使用的 System.out.println 方法,如下所示:

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

在这里,我还添加了return关键字,让程序在找到解决方案时退出solve方法。

希望这对您有所帮助。

关于Java 数独 - 不更改二维数组中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19214150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com