Problem p00190 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
#define MAX_N 20
#define WIDTH 100
int OK[5][5] = {{0, 0, 1, 0, 0},
                {0, 1, 1, 1, 0},
                {1, 1, 1, 1, 1},
                {0, 1, 1, 1, 0},
                {0, 0, 1, 0, 0}};
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
pair<int, vector<vector<int>>> dp[MAX_N + 2][WIDTH], E[WIDTH * 10];

int score(vector<vector<int>> p) {
  int sum = 0;
  pair<int, int> a[12], b[12];
  int CNT = 0;
  for (int i = 0; i < 25; i++) {
    if (p[i / 5][i % 5] >= 1)
      a[p[i / 5][i % 5]] = make_pair(i / 5, i % 5);
  }
  for (int i = 5; i < 20; i++) {
    if (OK[i / 5][i % 5] == 1) {
      CNT++;
      b[CNT] = make_pair(i / 5, i % 5);
    }
  }
  for (int i = 1; i <= 11; i++) {
    sum += abs(a[i].first - b[i].first) + abs(a[i].second - b[i].second);
  }
  return sum;
}
vector<vector<int>> Move(vector<vector<int>> p, int x, int y, int dir) {
  swap(p[x + dx[dir]][y + dy[dir]], p[x][y]);
  return p;
}
int BeemSearch(vector<vector<int>> Z) {
  vector<vector<int>> GOAL;
  int CNT = 0;
  for (int i = 0; i < 5; i++) {
    vector<int> GOAL2(5, -1);
    GOAL.push_back(GOAL2);
  }
  for (int i = 5; i < 20; i++) {
    if (OK[i / 5][i % 5] == 1) {
      CNT++;
      GOAL[i / 5][i % 5] = CNT;
    }
  }
  GOAL[0][2] = 0;
  GOAL[4][2] = 0;
  if (Z == GOAL)
    return 0;
  dp[0][0] = make_pair(score(Z), Z);
  for (int i = 0; i < MAX_N; i++) {
    int CNTS = 0;
    for (int j = 0; j < WIDTH; j++) {
      if (dp[i][j].second.size() == 0)
        continue;
      vector<vector<int>> D = dp[i][j].second;
      for (int k = 0; k < 25; k++) {
        if (D[k / 5][k % 5] != 0)
          continue;
        for (int l = 0; l < 4; l++) {
          int cx = (k / 5) + dx[l], cy = (k % 5) + dy[l];
          if (cx < 0 || cx >= 5 || cy < 0 || cy >= 5)
            continue;
          if (D[cx][cy] <= 0)
            continue;
          vector<vector<int>> D2 = Move(D, k / 5, k % 5, l);
          E[CNTS] = make_pair(score(D2), D2);
          CNTS++;
        }
      }
    }
    sort(E, E + CNTS);
    dp[i + 1][0] = E[0];
    int CNT2 = 1;
    if (E[0].first == 0)
      return i + 1;
    for (int i = 1; i < CNTS; i++) {
      if (E[i - 1] != E[i]) {
        dp[i + 1][CNT2] = E[i];
        CNT2++;
      }
      if (CNT2 == WIDTH)
        break;
    }
  }
  return -1;
}
int main() {
  while (true) {
    for (int i = 0; i < MAX_N + 2; i++) {
      for (int j = 0; j < WIDTH; j++) {
        vector<vector<int>> ZERO;
        dp[i][j] = make_pair(0, ZERO);
      }
    }
    for (int i = 0; i < WIDTH * 10; i++) {
      vector<vector<int>> ZERO;
      E[i] = make_pair(0, ZERO);
    }
    vector<vector<int>> C;
    for (int i = 0; i < 5; i++) {
      vector<int> C2(5, -1);
      C.push_back(C2);
    }
    cin >> C[0][2];
    if (C[0][2] == -1)
      break;
    for (int i = 1; i < 4; i++)
      cin >> C[1][i];
    for (int i = 0; i < 5; i++)
      cin >> C[2][i];
    for (int i = 1; i < 4; i++)
      cin >> C[3][i];
    cin >> C[4][2];
    int ret = BeemSearch(C);
    if (ret == -1)
      cout << "NA" << endl;
    else
      cout << ret << endl;
  }
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
#define MAX_N 20
#define WIDTH 100
int OK[5][5] = {{0, 0, 1, 0, 0},
                {0, 1, 1, 1, 0},
                {1, 1, 1, 1, 1},
                {0, 1, 1, 1, 0},
                {0, 0, 1, 0, 0}};
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
pair<int, vector<vector<int>>> dp[MAX_N + 2][WIDTH], E[WIDTH * 10];

int score(vector<vector<int>> p) {
  int sum = 0;
  pair<int, int> a[12], b[12];
  int CNT = 0;
  for (int i = 0; i < 25; i++) {
    if (p[i / 5][i % 5] >= 1)
      a[p[i / 5][i % 5]] = make_pair(i / 5, i % 5);
  }
  for (int i = 5; i < 20; i++) {
    if (OK[i / 5][i % 5] == 1) {
      CNT++;
      b[CNT] = make_pair(i / 5, i % 5);
    }
  }
  for (int i = 1; i <= 11; i++) {
    sum += abs(a[i].first - b[i].first) + abs(a[i].second - b[i].second);
  }
  return sum;
}
vector<vector<int>> Move(vector<vector<int>> p, int x, int y, int dir) {
  swap(p[x + dx[dir]][y + dy[dir]], p[x][y]);
  return p;
}
int BeemSearch(vector<vector<int>> Z) {
  vector<vector<int>> GOAL;
  int CNT = 0;
  for (int i = 0; i < 5; i++) {
    vector<int> GOAL2(5, -1);
    GOAL.push_back(GOAL2);
  }
  for (int i = 5; i < 20; i++) {
    if (OK[i / 5][i % 5] == 1) {
      CNT++;
      GOAL[i / 5][i % 5] = CNT;
    }
  }
  GOAL[0][2] = 0;
  GOAL[4][2] = 0;
  if (Z == GOAL)
    return 0;
  dp[0][0] = make_pair(score(Z), Z);
  for (int i = 0; i < MAX_N; i++) {
    int CNTS = 0;
    for (int j = 0; j < WIDTH; j++) {
      if (dp[i][j].second.size() == 0)
        continue;
      vector<vector<int>> D = dp[i][j].second;
      for (int k = 0; k < 25; k++) {
        if (D[k / 5][k % 5] != 0)
          continue;
        for (int l = 0; l < 4; l++) {
          int cx = (k / 5) + dx[l], cy = (k % 5) + dy[l];
          if (cx < 0 || cx >= 5 || cy < 0 || cy >= 5)
            continue;
          if (D[cx][cy] <= 0)
            continue;
          vector<vector<int>> D2 = Move(D, k / 5, k % 5, l);
          E[CNTS] = make_pair(score(D2), D2);
          CNTS++;
        }
      }
    }
    sort(E, E + CNTS);
    dp[i + 1][0] = E[0];
    int CNT2 = 1;
    if (E[0].first == 0)
      return i + 1;
    for (int j = 1; j < CNTS; j++) {
      if (E[j - 1] != E[j]) {
        dp[i + 1][CNT2] = E[j];
        CNT2++;
      }
      if (CNT2 == WIDTH)
        break;
    }
  }
  return -1;
}
int main() {
  while (true) {
    for (int i = 0; i < MAX_N + 2; i++) {
      for (int j = 0; j < WIDTH; j++) {
        vector<vector<int>> ZERO;
        dp[i][j] = make_pair(0, ZERO);
      }
    }
    for (int i = 0; i < WIDTH * 10; i++) {
      vector<vector<int>> ZERO;
      E[i] = make_pair(0, ZERO);
    }
    vector<vector<int>> C;
    for (int i = 0; i < 5; i++) {
      vector<int> C2(5, -1);
      C.push_back(C2);
    }
    cin >> C[0][2];
    if (C[0][2] == -1)
      break;
    for (int i = 1; i < 4; i++)
      cin >> C[1][i];
    for (int i = 0; i < 5; i++)
      cin >> C[2][i];
    for (int i = 1; i < 4; i++)
      cin >> C[3][i];
    cin >> C[4][2];
    int ret = BeemSearch(C);
    if (ret == -1)
      cout << "NA" << endl;
    else
      cout << ret << endl;
  }
  return 0;
}