Problem p00711 (C++)

Buggy submission (status: Runtime Error):
#include <iostream>
#include <string>
#include <vector>
using namespace std;

typedef vector<vector<int>> vector2d;

int main() {

  int H, W, count = 0, kaisuu = 0, kosuu, sum, judge;
  char map[20][20];
  vector2d nextx, nexty; // nextx[回数][個数]
  nextx.reserve(1000);
  nexty.reserve(1000);

  while (1) {
    cin >> W >> H;
    if (W == 0 && H == 0)
      break;

    // マップの入力
    for (int cH = 0; cH < H; cH++) {
      for (int cW = 0; cW < W; cW++) {
        cin >> map[cW][cH];
        if (map[cW][cH] == '@') {
          nextx[kaisuu].push_back(cW);
          nexty[kaisuu].push_back(cH);
        }
      }
    }
    sum = 1;
    while (1) {
      judge = 0;
      for (kosuu = 0; kosuu < nextx[kaisuu].size(); kosuu++) {
        if (nextx[kaisuu][kosuu] - 1 != -1) {
          if (map[nextx[kaisuu][kosuu] - 1][nexty[kaisuu][kosuu]] ==
              '.') { //@の左側をチェック
            // もし'@'だったらその座標を保存しそれを@に！
            nextx[kaisuu + 1].push_back(nextx[kaisuu][kosuu] - 1);
            nexty[kaisuu + 1].push_back(nexty[kaisuu][kosuu]);
            map[nextx[kaisuu][kosuu] - 1][nexty[kaisuu][kosuu]] = '@';
            sum++;
            judge++;
          }
        }
        if (nexty[kaisuu][kosuu] - 1 != -1) {
          if (map[nextx[kaisuu][kosuu]][nexty[kaisuu][kosuu] - 1] ==
              '.') { //@の上側をチェック
            // もし'@'だったらその座標を保存しそれを@に！
            nextx[kaisuu + 1].push_back(nextx[kaisuu][kosuu]);
            nexty[kaisuu + 1].push_back(nexty[kaisuu][kosuu] - 1);
            map[nextx[kaisuu][kosuu]][nexty[kaisuu][kosuu] - 1] = '@';
            sum++;
            judge++;
          }
        }
        if (nextx[kaisuu][kosuu] + 1 != W) {
          if (map[nextx[kaisuu][kosuu] + 1][nexty[kaisuu][kosuu]] ==
              '.') { //@の右側をチェック
            // もし'@'だったらその座標を保存しそれを@に！
            nextx[kaisuu + 1].push_back(nextx[kaisuu][kosuu] + 1);
            nexty[kaisuu + 1].push_back(nexty[kaisuu][kosuu]);
            map[nextx[kaisuu][kosuu] + 1][nexty[kaisuu][kosuu]] = '@';
            sum++;
            judge++;
          }
        }
        if (nexty[kaisuu][kosuu] + 1 != H) {
          if (map[nextx[kaisuu][kosuu]][nexty[kaisuu][kosuu] + 1] ==
              '.') { //@の下側をチェック
            // もし'@'だったらその座標を保存しそれを@に！
            nextx[kaisuu + 1].push_back(nextx[kaisuu][kosuu]);
            nexty[kaisuu + 1].push_back(nexty[kaisuu][kosuu] + 1);
            map[nextx[kaisuu][kosuu]][nexty[kaisuu][kosuu] + 1] = '@';
            sum++;
            judge++;
          }
        }
      }
      if (judge == 0)
        break;
      kaisuu++;
    }
    kaisuu++;
    cout << sum << endl;
  }

  return 0;
}

Fixed submission:
#include <iostream>
#include <string>
#include <vector>
using namespace std;

typedef vector<vector<int>> vector2d;

int main() {

  int H, W, count = 0, kaisuu = 0, kosuu, sum, judge;
  char map[20][20];
  vector2d nextx, nexty; // nextx[回数][個数]
  nextx.reserve(10000);
  nexty.reserve(10000);

  while (1) {
    cin >> W >> H;
    if (W == 0 && H == 0)
      break;

    // マップの入力
    for (int cH = 0; cH < H; cH++) {
      for (int cW = 0; cW < W; cW++) {
        cin >> map[cW][cH];
        if (map[cW][cH] == '@') {
          nextx[kaisuu].push_back(cW);
          nexty[kaisuu].push_back(cH);
        }
      }
    }
    sum = 1;
    while (1) {
      judge = 0;
      for (kosuu = 0; kosuu < nextx[kaisuu].size(); kosuu++) {
        if (nextx[kaisuu][kosuu] - 1 != -1) {
          if (map[nextx[kaisuu][kosuu] - 1][nexty[kaisuu][kosuu]] ==
              '.') { //@の左側をチェック
            // もし'@'だったらその座標を保存しそれを@に！
            nextx[kaisuu + 1].push_back(nextx[kaisuu][kosuu] - 1);
            nexty[kaisuu + 1].push_back(nexty[kaisuu][kosuu]);
            map[nextx[kaisuu][kosuu] - 1][nexty[kaisuu][kosuu]] = '@';
            sum++;
            judge++;
          }
        }
        if (nexty[kaisuu][kosuu] - 1 != -1) {
          if (map[nextx[kaisuu][kosuu]][nexty[kaisuu][kosuu] - 1] ==
              '.') { //@の上側をチェック
            // もし'@'だったらその座標を保存しそれを@に！
            nextx[kaisuu + 1].push_back(nextx[kaisuu][kosuu]);
            nexty[kaisuu + 1].push_back(nexty[kaisuu][kosuu] - 1);
            map[nextx[kaisuu][kosuu]][nexty[kaisuu][kosuu] - 1] = '@';
            sum++;
            judge++;
          }
        }
        if (nextx[kaisuu][kosuu] + 1 != W) {
          if (map[nextx[kaisuu][kosuu] + 1][nexty[kaisuu][kosuu]] ==
              '.') { //@の右側をチェック
            // もし'@'だったらその座標を保存しそれを@に！
            nextx[kaisuu + 1].push_back(nextx[kaisuu][kosuu] + 1);
            nexty[kaisuu + 1].push_back(nexty[kaisuu][kosuu]);
            map[nextx[kaisuu][kosuu] + 1][nexty[kaisuu][kosuu]] = '@';
            sum++;
            judge++;
          }
        }
        if (nexty[kaisuu][kosuu] + 1 != H) {
          if (map[nextx[kaisuu][kosuu]][nexty[kaisuu][kosuu] + 1] ==
              '.') { //@の下側をチェック
            // もし'@'だったらその座標を保存しそれを@に！
            nextx[kaisuu + 1].push_back(nextx[kaisuu][kosuu]);
            nexty[kaisuu + 1].push_back(nexty[kaisuu][kosuu] + 1);
            map[nextx[kaisuu][kosuu]][nexty[kaisuu][kosuu] + 1] = '@';
            sum++;
            judge++;
          }
        }
      }
      if (judge == 0)
        break;
      kaisuu++;
    }
    kaisuu++;
    cout << sum << endl;
  }

  return 0;
}