Problem p00481 (C++) — buggy submission, verdict: Runtime Error

#include <cctype>
#include <iostream>
#include <map>
#include <queue>
#include <stdio.h>
#include <stdlib.h>

#define p(s) puts("s")

using namespace std;
// from は残りのチーズ数
int bfs(int from);
// 訪れたら1
typedef pair<int, int> P;
char atlas[1000][1000] = {0};

int h, w, n;
// int start_i , start_j;
int dj[] = {0, 1, 0, -1};
int di[] = {-1, 0, 1, 0};

int main(int argc, char const *argv[]) {
  // 行数 一行の長さ 工場の数
  cin >> h >> w >> n;
  // atlas配列初期化&start位置取得
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> atlas[i][j];
    }
  }

  int sum = 0;
  for (int i = 0; i < n; i++) {
    // cout << "--------------------------------------------------" << endl;
    // cout << "call bfs(" << i << ")" << endl;
    sum += bfs(i);
    // cout << "bfs(" << i << ")  = " << bfs(i) << endl;
  }
  cout << sum << endl;
  return 0;
}

// チーズsからs+1までの最短経路を返す関数
int bfs(int s) {
  // cout << "enter bfs(" << s << ")"  << endl;

  // スタートを取得
  P start;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      // s==0  0=>S
      if (s == 0 && atlas[i][j] == 'S') {
        start = P(i, j);
      } // cout<< "start = "<<  i << ", " <<j <<endl; }
      else if (s != 0 && atlas[i][j] == '0' + s) {
        start = P(i, j);
      } // cout<< "start = "<<  i << ", " <<j <<endl; }
    }
  }

  // is_visit初期化
  int is_visit[1000][1000] = {0};
  queue<P> q;
  // map初期化
  map<P, int> dis;

  // 一つ入れる
  q.push(start);
  dis[start] = 0;

  while (q.size()) {
    // 一つ取り出す
    P now = q.front();
    q.pop();

    // 終了判定
    if (atlas[now.first][now.second] == '0' + s + 1) {
      // cout << "end of bfs(" << s << ")" << "now = (" << now.first <<"
      // ,"<<now.second <<")"<< endl;
      return dis[now];
    }

    // 分岐
    for (int i = 0; i < 4; i++) {
      P next = P(now.first + di[i], now.second + dj[i]);
      // 訪れてないか　枠の中か 障害物は無いか
      if (-1 < next.first && next.first < h && -1 < next.second &&
          next.second < w && dis.find(next) == dis.end() &&
          atlas[next.first][next.second] != 'X') {
        q.push(next);
        dis[next] = dis[now] + 1;
      }
    }
  }
}

Error: 0

Fixed submission:

#include <cctype>
#include <iostream>
#include <map>
#include <queue>
#include <stdio.h>
#include <stdlib.h>

#define p(s) puts("s")

using namespace std;
// from は残りのチーズ数
int bfs(int from);
// 訪れたら1
typedef pair<int, int> P;
char atlas[1000][1000] = {0};

int h, w, n;
// int start_i , start_j;
int dj[] = {0, 1, 0, -1};
int di[] = {-1, 0, 1, 0};

int main(int argc, char const *argv[]) {
  // 行数 一行の長さ 工場の数
  cin >> h >> w >> n;
  // atlas配列初期化&start位置取得
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> atlas[i][j];
      // if (atlas[i][j]== 'S')
      //{
      //     P start = pair<int, int>(i, j);
      // }
    }
  }

  int sum = 0;
  for (int i = 0; i < n; i++) {
    // cout << "--------------------------------------------------" << endl;
    // cout << "call bfs(" << i << ")" << endl;
    sum += bfs(i);
    // cout << "bfs(" << i << ")  = " << bfs(i) << endl;
  }
  cout << sum << endl;
  return 0;
}

// チーズsからs+1までの最短経路を返す関数
// start_indexを渡さないと行けない
int bfs(int s) {
  // cout << "enter bfs(" << s << ")"  << endl;

  // スタートを取得
  P start;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (s == 0 && atlas[i][j] == 'S') {
        start = P(i, j);
      } // cout<< "start = "<<  i << ", " <<j <<endl; }
      else if (s != 0 && atlas[i][j] == '0' + s) {
        start = P(i, j);
      } // cout<< "start = "<<  i << ", " <<j <<endl; }
    }
  }

  // is_visit初期化
  int is_visit[1000][1000] = {0};
  queue<P> q;
  map<P, int> dis;

  // 一つ入れる
  q.push(start);
  dis[start] = 0;

  while (q.size()) {
    // 一つ取り出す
    P now = q.front();
    q.pop();

    // 終了判定
    if (atlas[now.first][now.second] == '0' + s + 1) {
      // cout << "end of bfs(" << s << ")" << "now = (" << now.first <<"
      // ,"<<now.second <<")"<< endl;
      return dis[now];
    }

    // 分岐
    for (int i = 0; i < 4; i++) {
      P next = P(now.first + di[i], now.second + dj[i]);
      // 訪れてないか　枠の中か 障害物は無いか
      if (next.first < h && next.second < w && dis.find(next) == dis.end() &&
          atlas[next.first][next.second] != 'X') {
        q.push(next);
        dis[next] = dis[now] + 1;
      }
    }
  }
}