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

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

#define FOR(i, n, m) for (ll i = (n); i < (m); ++i)
#define REP(i, n) FOR(i, 0, n)

using Field = vector<vector<string>>;

pair<Field, int> move(const Field b, int dh, int dw) {
  Field res(2, vector<string>(2, ".."));
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      for (int k = 0; k < 2; k++) {
        if (0 <= j + dh && j + dh < 2 && 0 <= k + dw && k + dw < 2) {
          res[i][j + dh][k + dw] = b[i][j][k];
        } else {
          if (b[i][j][k] == '#') {
            return make_pair(res, -1);
          }
        }
      }
    }
  }
  return {res, 0};
}

Field drop(Field f, Field nb) {
  int soko = -1;

  for (int x = 18; x >= -1; x--) {
    if (x == -1) {
      soko = 0;
      break;
    }
    for (int i = 0; i < 2; i++) {
      for (int j = 0; j < 2; j++) {
        for (int k = 0; k < 2; k++) {
          if (f[i + x][j][k] == '#' && nb[i][j][k] == '#') {
            soko = x + 1;
          }
        }
      }
    }
    if (soko != -1) {
      break;
    }
  }

  Field res = f;
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      for (int k = 0; k < 2; k++) {
        if (nb[i][j][k] == '#') {
          res[i + soko][j][k] = '#';
        }
      }
    }
  }
  return res;
}

int fresh(Field &nf) {
  int res = 0;
  for (int i = 0; i < 20; i++) {
    bool isFresh = true;
    for (int j = 0; j < 2; j++) {
      for (int k = 0; k < 2; k++) {
        isFresh &= (nf[i][j][k] == '#');
      }
    }
    if (isFresh) {
      res++;
      for (int j = 0; j < 2; j++) {
        for (int k = 0; k < 2; k++) {
          nf[i][j][k] = '.';
        }
      }
      for (int ii = i + 1; ii < 20; ii++) {
        for (int j = 0; j < 2; j++) {
          for (int k = 0; k < 2; k++) {
            nf[ii - 1][j][k] = nf[ii][j][k];
          }
        }
      }
      i--;
    }
  }
  return res;
}

int dfs(int index, Field &f, const vector<Field> &blocks, const int n) {
  if (index == n)
    return 0;
  int res = 0;
  for (int dh = -1; dh <= 1; dh++) {
    for (int dw = -1; dw <= 1; dw++) {
      auto nbp = move(blocks[index], dh, dw);
      if (nbp.second == -1) {
        continue;
      }
      Field nb = nbp.first;
      Field nf = drop(f, nb);
      int sc = fresh(nf);
      res = max(sc + dfs(index + 1, nf, blocks, n), res);
    }
  }
  return res;
}
int solve(int h, int n) {
  Field f(20, vector<string>(2, ".."));
  for (int i = 0; i < h; i++) {
    cin >> f[i][0];
    cin >> f[i][1];
  }

  vector<Field> b(n, Field(2, vector<string>(2, "..")));
  for (int i = 0; i < n; i++) {
    cin >> b[i][0][0];
    cin >> b[i][0][1];
    cin >> b[i][1][0];
    cin >> b[i][1][1];
    if (b[i][0][0][0] == '.' && b[i][0][0][1] == '.' && b[i][0][1][0] == '.' &&
        b[i][0][1][1] == '.') {
      b[i][0][0][0] = b[i][1][0][0];
      b[i][0][0][1] = b[i][1][0][1];
      b[i][0][1][0] = b[i][1][1][0];
      b[i][0][1][1] = b[i][1][1][1];
      b[i][1][0][0] = '.';
      b[i][1][0][1] = '.';
      b[i][1][1][0] = '.';
      b[i][1][1][1] = '.';
    }
  }

  return dfs(0, f, b, n);
}
int main() {

  while (true) {
    int h, n;
    cin >> h >> n;
    if (h == 0)
      break;
    // cout<<h<<" "<<n<<endl;
    cout << solve(h, n) << endl;
  }
  return 0;
}


Error: -11

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

#define FOR(i, n, m) for (ll i = (n); i < (m); ++i)
#define REP(i, n) FOR(i, 0, n)

using Field = vector<vector<string>>;

pair<Field, int> move(const Field &b, int dh, int dw) {
  Field res(2, vector<string>(2, ".."));
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      for (int k = 0; k < 2; k++) {
        if (0 <= j + dh && j + dh < 2 && 0 <= k + dw && k + dw < 2) {
          res[i][j + dh][k + dw] = b[i][j][k];
        } else {
          if (b[i][j][k] == '#') {
            return make_pair(res, -1);
          }
        }
      }
    }
  }
  return {res, 0};
}

Field drop(const Field &f, const Field &nb) {
  int soko = -1;
  for (int x = 18; x >= -1; x--) {
    if (x == -1) {
      soko = 0;
      break;
    }
    for (int i = 0; i < 2; i++) {
      for (int j = 0; j < 2; j++) {
        for (int k = 0; k < 2; k++) {
          if (f[i + x][j][k] == '#' && nb[i][j][k] == '#') {
            soko = x + 1;
          }
        }
      }
    }
    if (soko != -1) {
      break;
    }
  }

  Field res = f;
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      for (int k = 0; k < 2; k++) {
        if (nb[i][j][k] == '#') {
          res[i + soko][j][k] = '#';
        }
      }
    }
  }
  return res;
}

int fresh(Field &nf) {
  int res = 0;
  for (int i = 0; i < 20; i++) {
    bool isFresh = true;
    for (int j = 0; j < 2; j++) {
      for (int k = 0; k < 2; k++) {
        isFresh &= (nf[i][j][k] == '#');
      }
    }
    if (isFresh) {
      res++;
      for (int j = 0; j < 2; j++) {
        for (int k = 0; k < 2; k++) {
          nf[i][j][k] = '.';
        }
      }
      for (int ii = i + 1; ii < 20; ii++) {
        for (int j = 0; j < 2; j++) {
          for (int k = 0; k < 2; k++) {
            nf[ii - 1][j][k] = nf[ii][j][k];
          }
        }
      }
      i--;
    }
  }
  return res;
}

int dfs(int index, Field &f, const vector<Field> &blocks, const int n) {
  if (index == n)
    return 0;
  int res = 0;
  for (int dh = -1; dh <= 1; dh++) {
    for (int dw = -1; dw <= 1; dw++) {
      auto nbp = move(blocks[index], dh, dw);
      if (nbp.second == -1) {
        continue;
      }
      Field nb = nbp.first;
      Field nf = drop(f, nb);
      int sc = fresh(nf);
      res = max(sc + dfs(index + 1, nf, blocks, n), res);
    }
  }
  return res;
}
int solve(int h, int n) {
  Field f(20, vector<string>(2, ""));
  for (int i = 0; i < h; i++) {
    cin >> f[i][0];
    cin >> f[i][1];
  }

  vector<Field> b(n, Field(2, vector<string>(2)));
  for (int i = 0; i < n; i++) {
    cin >> b[i][0][0];
    cin >> b[i][0][1];
    cin >> b[i][1][0];
    cin >> b[i][1][1];
    if (b[i][0][0][0] == '.' && b[i][0][0][1] == '.' && b[i][0][1][0] == '.' &&
        b[i][0][1][1] == '.') {
      b[i][0][0][0] = b[i][1][0][0];
      b[i][0][0][1] = b[i][1][0][1];
      b[i][0][1][0] = b[i][1][1][0];
      b[i][0][1][1] = b[i][1][1][1];
      b[i][1][0][0] = '.';
      b[i][1][0][1] = '.';
      b[i][1][1][0] = '.';
      b[i][1][1][1] = '.';
    }
  }

  return dfs(0, f, b, n);
}
int main() {

  while (true) {
    int h, n;
    cin >> h >> n;
    if (h == 0)
      break;
    // cout<<h<<" "<<n<<endl;
    cout << solve(h, n) << endl;
  }
  return 0;
}