簡體   English   中英

Java數獨求解器不會更改空單元格

[英]Java sudoku solver not changing empty cells

我正在編寫一個數獨求解器(仍然需要編寫盒子檢查並實際完成程序),但我正在測試它,因為我知道。 我正在測試的難題是“非常容易”,因為在任何行/列中只有一個空單元格。 這個謎題以“空”單元格開始為零。 我的問題是,當我調用solve()后運行程序並打印出拼圖時,零點不會改變,原始拼圖只是打印出來。 不確定我的問題是什么,會欣賞一些方向!

public ArrayList<Integer> create(){

    ArrayList<Integer> possible = new ArrayList<Integer>(); 

    for(int i=1; i<10; i++){
        possible.add(i);
    }
    return possible;
}
public sudoku( int size )
{
    SIZE = size;
    N = size*size;

    Grid = new int[N][N];
    for( int i = 0; i < N; i++ ) 
        for( int j = 0; j < N; j++ ) 
            Grid[i][j] = 0;
}

public void solve()
{ 
    int a, b, c, d, i, j, k, l; 

    int count = 0;
    int value= 0;

    for(i=0; i<N;i++){
        for(j=0; j<N;j++){  
            if(Grid[i][j]==0){

                ArrayList<Integer> possible = create();

                //check row             
                for(a=0; a<N;a++){
                    for(b=0; b<N; b++){  
                        if(Grid[a][0]==possible.get(a)){
                            possible.set(a, 0);
                        }
                    }
                }
                //check column
                for(c=0; c<N;c++){
                    for(d=0; d<N;d++){  
                        if(Grid[0][d]==possible.get(d)){
                            possible.set(d,0);
                        }
                    }
                }
                for(k=0; k<9; k++){
                    if(possible.get(k)!=0){
                        count++;
                    }
                }
                if(count==1){
                    for(l=0; l<9; l++){
                        if(possible.get(l)!=0){
                            value=possible.get(l);
                        }
                    }
                }
                Grid[i][j]=value;
            }
        }
    }
}
if(Grid[a][0]==possible.get(a))

if(Grid[0][d]==possible.get(d))

您不在這些行中使用b或c。 你可能想要:

if(Grid[a][i]==possible.get(b))

if(Grid[j][d]==possible.get(c))

此外, Grid[i][j]=value檢查應該在if塊內。

您可能希望將Set用於可能的值而不是ArrayList

看看你的行if(Grid[a][0]==possible.get(a)) (以及類似的點)。 它在做什么與你真正想要的是什么?

您可能的數組看起來像這樣: [1,2,3,4,5,6,7,8,9]

和你的網格(只是第一行,因為你只檢查Grid [a] [ 0 ])可能看起來像這樣: [3,7,8,1,2,9,5,0,4]

你的循環分別逐步查看每個元素並查看它們是否相等,如下所示:

if(1 == 3) ... it's not
if(2 == 7) ... it's not
if(3 == 8) ... it's not

......等

所以,正如你所看到的,當你做你的時候

for(k=0; k<9; k++){
    if(possible.get(k)!=0){
        count++;
    }
}

你的可能數組在大多數情況下仍然會充滿選項,除非你的第一行碰巧是[1,2,3,4,5,6,7,8,9]一些變化,其中0為一空間...所以計數肯定會> 1

所以,你的下一個循環( for(l=0; l<9; l++) )next會被執行,所以value仍然是(當你初始化它時)0。

嘗試逐步調試這些點上的調試器,看看數組是如何交互的。

您始終只檢查第一行和第一列,並且檢查可能的數字的方式也不是您想要的。

首先提示一些:

首先,沒有必要總是為循環定義一個新的變量,你可以重復使用它們,然后你就不會有太多它們,你就不會那么容易混淆它們。

其次,如果你命名所有的變量a,b,c,d等,你也很容易混淆。 雖然可以將循環中的變量命名為i,j,但如果循環太多,那么考慮更好的名稱可能會更好。 在這種情況下,例如行和列。

為什么不從可能的列表中刪除這些數字? 就像是:

int index = possible.indexOf(a);
if (index != -1) possible.remove(index);

然后,更容易確定您還剩下多少個值。 你可以簡單地做:

if (possible.size()==1) value = possible.get(0);

最后一點,為了遵守變量名稱的約定,你應該使用grid而不是Grid。

現在代碼:

public void solve() { 
    int row, column, i;
    int count = 0;
    int value= 0;
    int index = 0;

    for(row=0; row<N; row++){
        for(column=0; column<N; column++){  
            if(Grid[row][column]==0){

                ArrayList<Integer> possible = create();

                //check row             
                for(i=0; i<N; i++){
                    index = possible.indexOf(Grid[row][i]);
                    if (index != -1) possible.remove(index);
                }
                //check column
                for(i=0; i<N; i++){
                    index = possible.indexOf(Grid[i][column]);
                    if (index != -1) possible.remove(index);
                }

                if (possible.size()==1) value = possible.get(0);

                Grid[row][column]=value;
            }
        }
    }
}

編輯:將整個答案重寫為更好的形式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM