Problem p00223 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

int table[52][52];

bool memo[52][52][52][52];

const int leftmove = -1;
const int rightmove = 1;
const int upmove = -1;
const int downmove = 1;

int main() {

  while (1) {

    int w, h;

    // scanf(" %d %d",&w,&h);

    cin >> w >> h;

    if (w == 0 && h == 0)
      break;

    int tx, ty, kx, ky;

    // scanf(" %d %d %d %d",&tx,&ty,&kx,&ky);

    cin >> tx >> ty >> kx >> ky;

    for (int i = 0; i < 52; i++) {
      for (int j = 0; j < 52; j++) {
        for (int k = 0; k < 52; k++) {
          for (int r = 0; r < 52; r++) {
            memo[i][j][k][r] = false;
          }
        }
      }
    }

    for (int i = 1; i <= h; i++) {
      for (int j = 1; j <= w; j++) {
        cin >> table[j][i];
      }
    }

    /*printf("\\n");

    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            printf("%d ",table[i][j]);
        }
        printf("\\n");
    }*/

    // memset(memo,false,sizeof(memo));

    queue<vector<int>> q;

    vector<int> v(5);

    v[0] = tx;
    v[1] = ty;
    v[2] = kx;
    v[3] = ky;
    v[4] = 0;

    if (table[v[0]][v[1]] == 1 || table[v[2]][v[3]] == 1) {
      cout << "NA" << endl;
      continue;
    }

    if (v[0] == v[2] && v[1] == v[3]) {
      cout << 0 << endl;
      continue;
    }

    q.push(v);

    bool check = false;

    while (!q.empty()) {

      v = q.front();
      q.pop();

      if (v[0] == v[2] && v[1] == v[3]) {
        check = true;
        cout << v[4] << endl;
        break;
      }

      memo[v[0]][v[1]][v[2]][v[3]] = true;

      v[4]++;

      if (v[4] >= 100) {
        break;
      }

      vector<int> before(5);

      for (int i = 0; i < 5; i++) {
        before[i] = v[i];
      }

      if (v[0] + leftmove != 0 && table[v[0] + leftmove][v[1]] == 0) {
        v[0] += leftmove;
      }
      if (v[2] + rightmove != w + 1 && table[v[2] + rightmove][v[3]] == 0) {
        v[2] += rightmove;
      }

      if (!memo[v[0]][v[1]][v[2]][v[3]]) {
        if (v[0] == v[2] && v[1] == v[3]) {
          check = true;
          cout << v[4] << endl;
          break;
        }
        memo[v[0]][v[1]][v[2]][v[3]] = true;
        q.push(v);
      }

      for (int i = 0; i < 5; i++) {
        v[i] = before[i];
      }

      if (v[2] + leftmove != 0 && table[v[2] + leftmove][v[3]] == 0) {
        v[2] += leftmove;
      }
      if (v[0] + rightmove != w + 1 && table[v[0] + rightmove][v[1]] == 0) {
        v[0] += rightmove;
      }

      if (!memo[v[0]][v[1]][v[2]][v[3]]) {
        if (v[0] == v[2] && v[1] == v[3]) {
          check = true;
          cout << v[4] << endl;
          break;
        }
        memo[v[0]][v[1]][v[2]][v[3]] = true;
        q.push(v);
      }

      for (int i = 0; i < 5; i++) {
        v[i] = before[i];
      }

      if (v[3] + upmove != 0 && table[v[2]][v[3] + upmove] == 0) {
        v[3] += upmove;
      }
      if (v[1] + downmove != h + 1 && table[v[0]][v[1] + downmove] == 0) {
        v[1] += downmove;
      }

      if (!memo[v[0]][v[1]][v[2]][v[3]]) {
        if (v[0] == v[2] && v[1] == v[3]) {
          check = true;
          cout << v[4] << endl;
          break;
        }
        memo[v[0]][v[1]][v[2]][v[3]] = true;
        q.push(v);
      }

      for (int i = 0; i < 5; i++) {
        v[i] = before[i];
      }

      if (v[1] + upmove != 0 && table[v[0]][v[1] + upmove] == 0) {
        v[1] += upmove;
      }
      if (v[3] + downmove != h + 1 && table[v[2]][v[3] + downmove] == 0) {
        v[3] += downmove;
      }

      if (!memo[v[0]][v[1]][v[2]][v[3]]) {
        if (v[0] == v[2] && v[1] == v[3]) {
          check = true;
          cout << v[4] << endl;
          break;
        }
        memo[v[0]][v[1]][v[2]][v[3]] = true;
        q.push(v);
      }
    }

    if (!check) {
      cout << "NA" << endl;
    }
  }

  return 0;
}

Error: MLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

int table[52][52];

bool memo[52][52][52][52];

const int leftmove = -1;
const int rightmove = 1;
const int upmove = -1;
const int downmove = 1;

int main() {

  while (1) {

    int w, h;

    // scanf(" %d %d",&w,&h);

    cin >> w >> h;

    if (w == 0 && h == 0)
      break;

    int tx, ty, kx, ky;

    // scanf(" %d %d %d %d",&tx,&ty,&kx,&ky);

    cin >> tx >> ty >> kx >> ky;

    for (int i = 0; i < 52; i++) {
      for (int j = 0; j < 52; j++) {
        for (int k = 0; k < 52; k++) {
          for (int r = 0; r < 52; r++) {
            memo[i][j][k][r] = false;
          }
        }
      }
    }

    for (int i = 1; i <= h; i++) {
      for (int j = 1; j <= w; j++) {
        // scanf(" %d",&table[i][j]);
        cin >> table[i][j];
      }
    }

    /*printf("\\n");

    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            printf("%d ",table[i][j]);
        }
        printf("\\n");
    }*/

    // memset(memo,false,sizeof(memo));

    queue<vector<int>> q;

    vector<int> v(5);

    v[0] = tx;
    v[1] = ty;
    v[2] = kx;
    v[3] = ky;
    v[4] = 0;

    if (table[v[0]][v[1]] == 1 || table[v[2]][v[3]] == 1) {
      cout << "NA" << endl;
      continue;
    }

    q.push(v);

    bool check = false;

    while (!q.empty()) {

      v = q.front();
      q.pop();

      if (v[0] == v[2] && v[1] == v[3]) {
        check = true;
        cout << v[4] << endl;
        break;
      }

      memo[v[0]][v[1]][v[2]][v[3]] = true;

      v[4]++;

      if (v[4] >= 100) {
        break;
      }

      vector<int> before(5);

      for (int i = 0; i < 5; i++) {
        before[i] = v[i];
      }

      if (v[0] + leftmove != 0 && table[v[0] + leftmove][v[1]] == 0) {
        v[0] += leftmove;
      }
      if (v[2] + rightmove != w + 1 && table[v[2] + rightmove][v[3]] == 0) {
        v[2] += rightmove;
      }

      if (!memo[v[0]][v[1]][v[2]][v[3]]) {
        q.push(v);
      }

      for (int i = 0; i < 5; i++) {
        v[i] = before[i];
      }

      if (v[2] + leftmove != 0 && table[v[2] + leftmove][v[3]] == 0) {
        v[2] += leftmove;
      }
      if (v[0] + rightmove != w + 1 && table[v[0] + rightmove][v[1]] == 0) {
        v[0] += rightmove;
      }

      if (!memo[v[0]][v[1]][v[2]][v[3]]) {
        q.push(v);
      }

      for (int i = 0; i < 5; i++) {
        v[i] = before[i];
      }

      if (v[3] + upmove != 0 && table[v[2]][v[3] + upmove] == 0) {
        v[3] += upmove;
      }
      if (v[1] + downmove != h + 1 && table[v[0]][v[1] + downmove] == 0) {
        v[1] += downmove;
      }

      if (!memo[v[0]][v[1]][v[2]][v[3]]) {
        q.push(v);
      }

      for (int i = 0; i < 5; i++) {
        v[i] = before[i];
      }

      if (v[1] + upmove != 0 && table[v[0]][v[1] + upmove] == 0) {
        v[1] += upmove;
      }
      if (v[3] + downmove != h + 1 && table[v[2]][v[3] + downmove] == 0) {
        v[3] += downmove;
      }

      if (!memo[v[0]][v[1]][v[2]][v[3]]) {
        q.push(v);
      }
    }

    if (!check) {
      cout << "NA" << endl;
    }
  }

  return 0;
}