0

我对数独算法有点卡住了,我使用回溯对其进行编码,并按照理论上的步骤进行操作,这应该可以工作,我尝试调试它,但是太难了(是的,它解决了一些数字并做了一些事情)

我贴上代码,希望你能帮帮我,我实在看不出问题出在哪里……

public void backtracking(int row,int col){
    if(row > 8){ 
        System.out.println("Solution Found!!"); 
        printSudoku(); 

    }
    if (m[row][col] != 0){
       next(row, col);
    }
    else {
        for(int i =1; i < n;i++) 
            if(row(row, i) && col(col, i)) {
                m[row][col] =i;
                next(row, col);
            }
        m[row][col] = 0;
    }


} 

public void next( int row, int col ) {
   if( col < 8)
       backtracking( row, col + 1 ) ;
   else
       backtracking( row+ 1, 0 ) ;
}

public boolean region(int x, int y, int numReg) {
    x = (x / 3) * 3 ;
    y = (y / 3) * 3 ;
    for( int r = 0; r < 3; r++ )
        for( int c = 0; c < 3; c++ )
        if( m[x+r][y+c] == numReg )
           return false ;

     return true ;
}

public boolean row(int x, int k){
    for(int i =0; i < 9; i++)
        if(m[x][i] == k)
            return false;
    return true;
}

public boolean col(int x, int k){
    for(int i =0; i < 9; i++)
        if(m[i][x] == k)
            return false;
    return true;
}

我省略了“printSudoku”方法,只是你知道的。

4

1 回答 1

1

代码似乎几乎是正确的。据我所知,您只是忘记调用 region 方法。而且我看不到变量 n 的来源。试试这个稍微修改过的回溯方法:

    public static void backtracking(int row, int col) {
    if (row > 8) {
        System.out.println("Solution Found!!");
        printSudoku();
        System.exit(0); //exiting after solution is found
    }
    if (m[row][col] != 0) {
        next(row, col);
    } else {
        for (int i = 1; i <= 9; i++) //replaced i < n with i<=9
            if (row(row, i) && col(col, i) && region(row, col, i)) { //calling region method too
                m[row][col] = i;
                next(row, col);
            }
        m[row][col] = 0;
    }

}
于 2013-04-22T17:36:59.587 回答