0

私は数独ソルバーを書いている最中です (ボックスチェックを書き、実際にプログラムを完成させる必要があります) が、私が知っているようにテストしています。私が現在テストしているパズルは「非常に簡単」で、どの行/列にも空のセルが 1 つしかないためです。パズルは、「空の」セルをゼロとして開始します。私の問題は、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;
            }
        }
    }
}
4

3 に答える 3

1

あなたのライン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つに0があるバリエーションである場合を除いて、可能な配列はほとんどの場合オプションでいっぱいになり[1,2,3,4,5,6,7,8,9]ます...したがって、カウントは間違いなく>1になります

したがって、次のループ(for(l=0; l<9; l++))nextが実行されるため、値は(初期化した時点で)0のままです。

これらのポイントでデバッガーをステップスルーして、アレイがどのように相互作用しているかを確認してみてください。

于 2012-04-15T15:07:17.497 に答える
1
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ます。

于 2012-04-15T14:59:30.943 に答える
0

常に最初の行と最初の列のみをチェックしており、可能な数字をチェックする方法もあなたが望むことをしていません。

最初にいくつかのヒント:

まず第一に、ループのために常に新しい変数を定義する必要はありません。それらを再利用することができます。そうすれば、それらの数が多すぎず、簡単に混乱することもありません。

第 2 に、すべての変数に 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;
            }
        }
    }
}

編集:回答全体をより良い形に書き直しました。

于 2012-04-15T14:58:00.167 に答える