0

再帰を使用する必要がある数独パズルソルバーがあります。問題は、使用可能なスペースをチェックするブール値が参照によって現在の位置を更新することになっていますが、そうではありません。これは何が原因でしょうか?

    public boolean solve()
{
    Coordinate current = new Coordinate(); 

    if (findEmptyGridSlot(current)) {   // THE ERROR IS HERE **********  THIS IS SHOWING (0,0) STILL ******************

        for (int number = 1; number <= 9; number++)  
            if (canPlaceNumber(current, number)) { 
                grid[current.getRow()][current.getColumn()] = number; 

                if (solve()) 
                    return true; 

                grid[current.getRow()][current.getColumn()] = 0; 
            } return false;
    }else
        return true;

}

private boolean findEmptyGridSlot(Coordinate coordinate)
{
    boolean found = false;

    try{
        while (!found) 
        {
            if (grid[coordinate.getRow()][coordinate.getColumn()] == 0)
                found = true;
            else
                coordinate = coordinate.next(); // *****This is supposed to update the current coordinate ******
        }
    }catch (Exception e){
        //CREATE No Empty Cells Exception
    } 
    return found;
}

public Coordinate next()
{
    Coordinate result = new Coordinate(row, column);

    result.column++;
    if (result.column > MAX_COORDINATE)
    {
        result.column = MIN_COORDINATE;
        result.row++;
        if (result.row > MAX_COORDINATE) result = null;
    }

    return result;
}
4

2 に答える 2

1

Javaは値を渡します。これは、座標への参照のコピーを取得していることを意味します。そのコピーを新しいオブジェクト(つまりcoordinate = coordinate.next)にポイントすると、ローカルコピーのみが変更されます。一方、オブジェクトの属性を変更した場合、変数が参照している(たとえばcoordinate.x = foo、またはcoordinate.setX(foo))その変更は、メソッドの呼び出し元に表示されます。

于 2013-03-21T21:45:13.680 に答える
1

jpmは正しいのですが、初めて読み間違えたのでわかりやすくしようと思います

private boolean findEmptyGridSlot(Coordinate coordinate)

参照は値によって渡されます。これらの用語で考えると、「座標」は一枚の紙を保持するボックスであり、一枚の紙に住所が書かれています。座標はこのメソッドのみに属するボックスであり、独自の紙があります(多くの紙には同じアドレスが書かれている場合があります)

このボックスを見て、紙に書かれたアドレスに「投稿」することができますが、

coordinate=something

これは、新しい紙に「何か」のアドレスを書くことを意味します。古い紙を捨てなさい。

このアクションは、最初の紙に住所が記載されていた元の「家」にはまったく影響しません。友人のジョンが彼の名簿を更新するとき、彼が何を書いても関係ありません、私はまだ私の家に住んでいます。

したがって、座標に簡単な下部構造(xとyなど)がある場合は、xとyを「次の」ものと等しくなるように変更する命令を「投稿」できます。

または、ハックとして、Coordinateを別のオブジェクト内に囲んで、ハッククラスが指すものを変更するように指示を投稿することができます。

コメントで参照されているテストコード:

public class Test {

    public static void main(String args[]){
        String bareMinObject="start";
        changeString(bareMinObject);
        System.out.println(bareMinObject); //Prints start, change string has no effect

    }

    public static void changeString(String input){
        String temp="end";
        input=temp;

    }

}
于 2013-03-21T22:05:37.017 に答える