0

C++ で迷路を解くためにこの関数を使用していますが、プログラムを実行すると、再帰で Bad Access Error が発生します。たぶん無限ループだと思います。どこで何が問題になっているのかわかりません。

bool Solve_Maze(int coorx,int coory) {
    if((Map[coorx][coory]==Start)||(Map[coorx][coory]==path)) {
        Map[coorx][coory]=wall;
        Solve_Maze(coorx+1,coory);
        Solve_Maze(coorx-1,coory);
        Solve_Maze(coorx,coory+1);
        Solve_Maze(coorx,coory-1);
    }else if(Map[coorx][coory]==End) {
        cout<<"You Solved the Maze!"<<endl;
        delete Map;
        return(true);
    }
}
4

3 に答える 3

2

値がスタックに正しく返されていなかったため、void を返すように関数を変更しました。この場合、終わりが見つかったかどうかを確認するために、グローバルに見つかった変数を使用するだけです。(これには、関数を実行する前に毎回 'found = false' を設定する必要があります)。

bool found = false;

また、いくつかの入力検証を行いたい

if( coorx > maxX || coorx < 0 || coory > maxY || coory < 0) return;

maxX と maxY を、coorx と coory の最大値よりも 1 大きい値に置き換える必要があります。これにより、不正なアクセス エラーが発生しなくなります。

bool found = false; // this will be global scope or pass it by reference
Solve_Maze(x,y);
// if(found) - found will be true if you found the end

void Solve_Maze(int coorx,int coory) {
    if( coorx > maxX || coorx < 0 || coory > maxY || coory < 0) return;
    else if(((Map[coorx][coory]==Start)||(Map[coorx][coory]==path))) {
        Map[coorx][coory]=wall;
        Solve_Maze(coorx+1,coory);
        Solve_Maze(coorx-1,coory);
        Solve_Maze(coorx,coory+1);
        Solve_Maze(coorx,coory-1);
    }else if(Map[coorx][coory]==End) {
        cout<<"You Solved the Maze!"<<endl;
        delete Map;
        found = true;
    }
}
于 2012-05-19T05:49:32.933 に答える
2

1) if ステートメントで値を返していない
2) Map[coorx][coory] ​​すべての関数呼び出しで常に壁に割り当てられている..壁はグローバル状態を参照していますか?

于 2012-05-19T05:27:54.367 に答える
0

デバッガー (gdb または dbx) で実行します。-g フラグを指定してコンパイルすると、プログラムをデバッグできます。デバッガの使い方がわからない場合は、「dbx cheatsheet」で検索してください。ループでスタックしている場所を特定し (推測が正しければ)、手順を進めることができます。デバッガーでこれを行うのに十分に習熟するのにかかる合計時間は、実際にデバッガーを実行するのにかかる時間は、既に考えている時間よりも短くなります。

皮肉を言うつもりはありません - 人々は実際、デバッガーを学習する作業を過大評価することがよくあります。そのため、単純な問題であってもそれだけの価値があり、大きな問題には多大な見返りがあることを強く主張したいと思います。

于 2012-05-19T05:23:03.880 に答える