[英]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.