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

#include "bits/stdc++.h"
#include <unordered_map>
#include <unordered_set>
#pragma warning(disable : 4996)
using namespace std;
using ld = long double;
const ld eps = 1e-9;

bool check(const vector<vector<pair<int, int>>> &humans, int x, int y) {
  for (int i = 0; i < 4; ++i) {
    auto it = find(humans[i].begin(), humans[i].end(), make_pair(x, y));
    if (it != humans[i].end())
      return false;
  }
  return true;
}

int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};

int main() {
  while (true) {
    int W, H;
    cin >> W >> H;
    if (!W)
      break;
    vector<vector<int>> field(H, vector<int>(W));

    string name = "WSEN";

    vector<vector<pair<int, int>>> humans(4);
    for (int i = 0; i < H; ++i) {
      string st;
      cin >> st;
      for (int j = 0; j < W; ++j) {
        char ch(st[j]);
        if (ch == '#')
          field[i][j] = 1;
        else if (ch == '.')
          field[i][j] = 0;
        else if (ch == 'X')
          field[i][j] = 2;
        else {
          int k = name.find(ch);
          if (k == string::npos) {
            assert(false);
          } else {
            field[i][j] = 0;
            k = k % 4;
            humans[k].push_back(make_pair(j, i));
          }
        }
      }
    }

    int time;
    for (time = 1; time < 200; ++time) {
      vector<vector<int>> ways(4);
      vector<vector<pair<int, int>>> next_humans(4);
      for (int i = 0; i < 4; ++i) {
        for (auto human : humans[i]) {
          int now_x = human.first;
          int now_y = human.second;

          int ans = 4;

          for (int plus_way = -1; plus_way < 3; ++plus_way) {
            int next_way = (i + 4 + plus_way) % 4;

            int next_x = now_x + dx[next_way];
            int next_y = now_y + dy[next_way];

            if (field[next_y][next_x] != 1 &&
                check(humans, next_x, next_y) == true) {
              ans = next_way;
              break;
            }
          }
          ways[i].push_back(ans);
        }
      }

      vector<vector<int>> moved(H, vector<int>(W));

      for (int k = 0; k < 5; ++k) {
        for (int i = 0; i < 4; ++i) {
          for (int j = 0; j < humans[i].size(); ++j) {
            if (ways[i][j] == k) {
              if (k == 4) {
                next_humans[i].push_back(humans[i][j]);
              } else {
                int next_x = humans[i][j].first + dx[ways[i][j]];
                int next_y = humans[i][j].second + dy[ways[i][j]];

                if (moved[next_y][next_x]) {
                  next_humans[ways[i][j]].push_back(humans[i][j]);
                } else {

                  moved[next_y][next_x] = true;
                  if (field[next_y][next_x] == 2) {
                    continue;
                  }
                  next_humans[ways[i][j]].push_back(make_pair(next_x, next_y));
                }
              }
            }
          }
        }
      }

      humans = next_humans;
      if (all_of(humans.begin(), humans.end(),
                 [](const vector<pair<int, int>> &v) { return v.empty(); })) {
        break;
      }
    }
    if (time > 180) {
      cout << "NA" << endl;
    } else {
      cout << time << endl;
    }
  }
  return 0;
}


Error: 0

Fixed submission:

#include "bits/stdc++.h"
#include <unordered_map>
#include <unordered_set>
#pragma warning(disable : 4996)
using namespace std;
using ld = long double;
const ld eps = 1e-9;

bool check(const vector<vector<pair<int, int>>> &humans, int x, int y) {
  for (int i = 0; i < 4; ++i) {
    auto it = find(humans[i].begin(), humans[i].end(), make_pair(x, y));
    if (it != humans[i].end())
      return false;
  }
  return true;
}

int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

int main() {
  while (true) {
    int W, H;
    cin >> W >> H;
    if (!W)
      break;
    vector<vector<int>> field(H, vector<int>(W));

    string name = "WSEN";

    vector<vector<pair<int, int>>> humans(4);
    for (int i = 0; i < H; ++i) {
      string st;
      cin >> st;
      for (int j = 0; j < W; ++j) {
        char ch(st[j]);
        if (ch == '#')
          field[i][j] = 1;
        else if (ch == '.')
          field[i][j] = 0;
        else if (ch == 'X')
          field[i][j] = 2;
        else {
          int k = name.find(ch);
          if (k == string::npos) {
            assert(false);
          } else {
            field[i][j] = 0;
            k = k % 4;
            if (k == 0)
              k = 2;
            else if (k == 2)
              k = 0;
            humans[k].push_back(make_pair(j, i));
          }
        }
      }
    }

    int time;
    for (time = 1; time < 200; ++time) {
      vector<vector<int>> ways(4);
      vector<vector<pair<int, int>>> next_humans(4);
      for (int i = 0; i < 4; ++i) {
        for (auto human : humans[i]) {
          int now_x = human.first;
          int now_y = human.second;

          int ans = 4;

          for (int plus_way = 1; plus_way > -3; --plus_way) {
            int next_way = (i + 4 + plus_way) % 4;

            int next_x = now_x + dx[next_way];
            int next_y = now_y + dy[next_way];

            if (field[next_y][next_x] != 1 &&
                check(humans, next_x, next_y) == true) {
              ans = next_way;
              break;
            }
          }
          ways[i].push_back(ans);
        }
      }

      vector<vector<int>> moved(H, vector<int>(W));

      vector<int> ts = {2, 1, 0, 3, 4};
      for (int vv = 0; vv < 5; ++vv) {
        for (int i = 0; i < 4; ++i) {
          for (int j = 0; j < humans[i].size(); ++j) {
            int k = ts[vv];
            if (ways[i][j] == k) {
              if (k == 4) {
                next_humans[ways[i][j]].push_back(humans[i][j]);

              } else {
                int next_x = humans[i][j].first + dx[ways[i][j]];
                int next_y = humans[i][j].second + dy[ways[i][j]];

                if (moved[next_y][next_x]) {
                  next_humans[ways[i][j]].push_back(humans[i][j]);
                } else {

                  if (field[next_y][next_x] == 2)
                    continue;
                  moved[next_y][next_x] = true;
                  next_humans[ways[i][j]].push_back(make_pair(next_x, next_y));
                }
              }
            }
          }
        }
      }

      humans = next_humans;
      if (all_of(humans.begin(), humans.end(),
                 [](const vector<pair<int, int>> &v) { return v.empty(); })) {
        break;
      }
    }
    if (time > 180) {
      cout << "NA" << endl;
    } else {
      cout << time << endl;
    }
  }
  return 0;
}