@mihayama1005

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

原因不明の Segmentation Fault

最短経路に関する問題を解いたところ、Segmentation Faultが出たのですが、原因がわかりません。
解決方法を教えてください。
(よろしければ、どのようにしてSegmentation Faultの原因を見つけられるのかについてもご記載いただけると嬉しいです。)

<問題文>
大きさがN×Mの迷路が与えられます。迷路は通路と壁からできており、1ターンに隣接する上下左右4マスの通路へ移動することができます。スタートからゴールまで移動するのに必要な最小のターン数を求めなさい。(制約 N,M <= 100)

<入力例>
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

<出力例>
22

発生している問題・エラー

Segmentation fault

該当するソースコード

#include<bits/stdc++.h>
using namespace std;

int maze_cost(vector<vector<char>>,vector<vector<int>>,int,int);
int N,M;

int main(){
    //入力部分
    cin >> N >> M;
    int start_x,start_y;
    vector<vector<char>> maze(N, vector<char>(M));
    for(int i = 0; i < N; i++){
        for(int j = 0; j < M; j++){
            cin >> maze.at(i).at(j);
            if(maze.at(i).at(j) == 'S'){
                start_x = j;
                start_y = i;
            }
        }
    }

    //実行部分
    vector<vector<int>> cost(N, vector<int>(M,100000));
    cost.at(start_y).at(start_x) = 0;
    int finally_cost = maze_cost(maze,cost,start_x,start_y);

    //結果出力
    cout << finally_cost << endl;
    return 0;


}

int maze_cost( vector<vector<char>> neo_maze, vector<vector<int>> neo_cost, int now_x, int now_y){
    if(neo_maze.at(now_y).at(now_x) == 'G'){
        return neo_cost.at(now_y).at(now_x);
    }
    
    if(now_x + 1 < M){
        if(neo_maze.at(now_y).at(now_x + 1) == '.'){
            int young_cost = neo_cost.at(now_y).at(now_x) + 1;
            if(neo_cost.at(now_y).at(now_x + 1) > young_cost){
                neo_cost.at(now_y).at(now_x + 1) = young_cost;
            }
            maze_cost(neo_maze,neo_cost,now_x + 1, now_y);
        }
    }
    if(now_y + 1 < N){
        if(neo_maze.at(now_y + 1).at(now_x) == '.'){
            int young_cost = neo_cost.at(now_y).at(now_x) + 1;
            if(neo_cost.at(now_y + 1).at(now_x) > young_cost){
                neo_cost.at(now_y + 1).at(now_x) = young_cost;
            }
            maze_cost(neo_maze,neo_cost,now_x, now_y + 1);
        }
    }
    if(now_x - 1 >= 0){
        if(neo_maze.at(now_y).at(now_x - 1) == '.'){
            int young_cost = neo_cost.at(now_y).at(now_x) + 1;
            if(neo_cost.at(now_y).at(now_x - 1) > young_cost){
                neo_cost.at(now_y).at(now_x - 1) = young_cost;
            }
            maze_cost(neo_maze,neo_cost,now_x - 1, now_y);
        }
    }
    if(now_y - 1 >= 0){
        if(neo_maze.at(now_y - 1).at(now_x) == '.'){
            int young_cost = neo_cost.at(now_y).at(now_x) + 1;
            if(neo_cost.at(now_y - 1).at(now_x) > young_cost){
                neo_cost.at(now_y - 1).at(now_x) = young_cost;
            }
            maze_cost(neo_maze,neo_cost,now_x, now_y - 1);
        }
    }
    return 114514;
}

自分で試したこと

適当に問題がありそうな箇所にブレークポイントを置き、そのポイントよりも少し上の箇所で何らかを出力しようとしましたが、それでもSegmentation Faultとなり出力されませんでした。

0 likes

1Answer

配列外参照でなければ、再帰呼び出しの無限ループによるスタックオーバフローではないでしょうか?
(同じマスに行ったり来たりしていませんか?)
コンパイル時に-gオプションをつけると、エラー箇所が見えるかも?

1Like

Comments

  1. @mihayama1005

    Questioner

    解決しました。
    ありがとうございます!!

  2. 解決であれば、当Q&Aをクローズしてください。

    ちなみに、どこをどう変更して解決したのかを、
    簡素に記載していただくと、他の方の参考になるかと思います。

Your answer might help someone💌