Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java数独-在2D数组中不更改字段_Java_Arrays_Recursion_Sudoku - Fatal编程技术网

Java数独-在2D数组中不更改字段

Java数独-在2D数组中不更改字段,java,arrays,recursion,sudoku,Java,Arrays,Recursion,Sudoku,我遇到了一个问题。我在Java方面相对较新,我正试图从一些比我习惯的更复杂的方面入手。这是我自己的个人文件输入和main方法与其他方法的同类源代码的组合。我对递归仍然相当生疏。出于某种原因,用于更改2D数组“board”中的值的赋值命令正在正常运行,但没有更改值。在我看来,至少在结构上,一切都是洁净的,但正如我所说,我是新来的 另外,我正在用完成的程序在终端上寻找文本输出,抛出异常似乎只是终端上的一个障碍。有什么建议吗 import java.util.Scanner; import java.

我遇到了一个问题。我在Java方面相对较新,我正试图从一些比我习惯的更复杂的方面入手。这是我自己的个人文件输入和main方法与其他方法的同类源代码的组合。我对递归仍然相当生疏。出于某种原因,用于更改2D数组“board”中的值的赋值命令正在正常运行,但没有更改值。在我看来,至少在结构上,一切都是洁净的,但正如我所说,我是新来的

另外,我正在用完成的程序在终端上寻找文本输出,抛出异常似乎只是终端上的一个障碍。有什么建议吗

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;

        }
    }
}
import java.util.Scanner;
导入java.io.File;
公共级Sudoku2{
静态int板[][]=新int[10][10];
静态int回溯=0;
公共静态void main(字符串[]args)引发异常{
Sudoku2 myPuzzle=新的Sudoku2();
//myPuzzle.readboard();
myPuzzle.readData(“./board/input.txt”);
myPuzzle.solve(0,0);
印制板();
}
受保护的静态无效打印板(){
System.out.println(“这是你的谜题:”);
for(int r=0;r<9;r++){
对于(int c=0;c<9;c++){
系统输出打印(单板[r][c]+“”);
}
System.out.println(“”);
}
}
公共void readData(字符串文件名){
文件输入文件=新文件(文件名);
试一试{
扫描仪键盘=新扫描仪(输入文件);
对于(int行=0;行<9;行++){
for(int col=0;col<9;col++){
board[row][col]=键盘.nextInt();
}
}
键盘关闭();
}捕获(例外e){
系统输出打印(“读取文件中的问题”+e);
e、 printStackTrace();
}
}
//检查行中是否有效
受保护的静态布尔值validInRow(int行,int值)
{
for(int col=0;col<9;col++)
if(线路板[行][列]==值)
返回false;
返回true;
}
//检查在列中是否有效
受保护的静态布尔值validInCol(int-col,int-value)
{
对于(int行=0;行<9;行++)
if(线路板[行][列]==值)
返回false;
返回true;
}
//检查是否在3*3中有效
受保护的静态布尔validInBlock(int行、int列、int值)
{
行=(行/3)*3;
col=(col/3)*3;
对于(int r=0;r<3;r++)
对于(int c=0;c<3;C++)
if(线路板[行+r][列+c]==值)
返回false;
返回true;
}
//调用其他方法
公共void solve(int行,int列)引发异常
{
如果(第8行)
{
印制板();
抛出新异常(“找到解决方案”);
}
其他的
{
while(板[行][列]!=0)
{
如果(++col>8)
{
col=0;
行++;
如果(第8行)
印制板();
抛出新异常(“找到解决方案”);
}
}
用于(int值=1;值<10;值++)
{
if(validInRow(行,值)和validInCol(列,值)和validInBlock(行,列,值))
{
板[行][列]=值;
//新PrintEvent(董事会);
if(col<8)
求解(行,列+1);
其他的
求解(行+1,0);
回溯++;
}
}
线路板[行][列]=0;
}
}
}

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
方法


希望这有帮助。

您应该正确格式化代码,这很难阅读。您的IDE应该有一个自动格式化选项。我马上注意到的一件事是,您没有将if语句括起来,而是在其中一些语句之后缩进了多个调用,这让我觉得您可能认为这会使它们成为if语句的一部分。如果没有方括号,if语句只包含它后面的一行。将异常作为输出抛出从根本上说是错误的。给
solve()
方法一个返回类型,或者让它修改电路板,然后调用
printBoard()
。你已经打印到System.out了,所以我不明白这部分问题。相反,有一些控制语句,如
return
中断