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

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;

typedef struct {
  int x;         //?????¨??????????¨???§?¨?
  int y;         //?????¨??????????????§?¨?
  int turn;      //???????????????????????°
  int f[20][20]; //?????£??????????????¶???
} info;

int main() {
  while (1) {
    int w, h;
    info st; //????????¶???

    // input
    scanf(" %d %d", &w, &h);
    if (w == 0)
      break;
    for (int i = 0; i < h; ++i) {
      for (int j = 0; j < w; ++j) {
        scanf(" %d", &st.f[i][j]);
        if (st.f[i][j] == 2) {
          st.y = i;
          st.x = j;
        }
      }
    }
    st.turn = 0;

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

    int ans = -1;
    // BFS
    queue<info> que;
    que.push(st);
    while (!que.empty()) {
      info p = que.front();
      que.pop();

      //????????????????????????????????????
      for (int i = 0; i < 4; ++i) {
        info v = p;

        //????????????????????¢??????????????§???????????????
        if (v.x + dx[i] < 0 || v.x + dx[i] >= w)
          continue;
        if (v.y + dy[i] < 0 || v.y + dy[i] >= h)
          continue;
        //?????????????????????????????£??\\??????????????????????????????
        if (v.f[v.y + dy[i]][v.x + dx[i]] == 1)
          continue;

        //????????\\?????????????????????????????????
        int nx = v.x, ny = v.y;
        for (int j = 1; j <= 20; ++j) {
          nx = v.x + j * dx[i];
          ny = v.y + j * dy[i];

          //?????????
          if (nx < 0 || nx >= w)
            break;
          if (ny < 0 || ny >= h)
            break;

          if (v.f[ny][nx] == 3) { //??´????????°???
            ans = v.turn + 1;
            break;
          } else if (v.f[ny][nx] == 1) { //?????????
            v.f[ny][nx] = 0;             //?????????????¶???????
            //?????????????????????
            nx -= dx[i];
            ny -= dy[i];
            v.x = nx;
            v.y = ny;
            v.turn++;
            if (v.turn < 10)
              que.push(v);
            break;
          }
        }
      }
      if (ans > 0)
        break;
    }

    printf("%d\\n", ans);
  }
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;

typedef struct {
  int x;         //?????¨??????????¨???§?¨?
  int y;         //?????¨??????????????§?¨?
  int turn;      //???????????????????????°
  int f[20][20]; //?????£??????????????¶???
} info;

int main() {
  while (1) {
    int w, h;
    info st; //????????¶???

    // input
    scanf(" %d %d", &w, &h);
    if (w == 0)
      break;
    for (int i = 0; i < h; ++i) {
      for (int j = 0; j < w; ++j) {
        scanf(" %d", &st.f[i][j]);
        if (st.f[i][j] == 2) {
          st.y = i;
          st.x = j;
        }
      }
    }
    st.turn = 0;

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

    int ans = -1;
    // BFS
    queue<info> que;
    que.push(st);
    while (!que.empty()) {
      info p = que.front();
      que.pop();
      if (p.turn == 10)
        continue; //?????????????????????

      //????????????????????????????????????
      for (int i = 0; i < 4; ++i) {
        info v = p;

        //????????????????????¢??????????????§???????????????
        if (v.x + dx[i] < 0 || v.x + dx[i] >= w)
          continue;
        if (v.y + dy[i] < 0 || v.y + dy[i] >= h)
          continue;
        //?????????????????????????????£??\\??????????????????????????????
        if (v.f[v.y + dy[i]][v.x + dx[i]] == 1)
          continue;

        //????????\\?????????????????????????????????
        int nx = v.x, ny = v.y;
        for (int j = 1; j <= 20; ++j) {
          nx = v.x + j * dx[i];
          ny = v.y + j * dy[i];

          //?????????
          if (nx < 0 || nx >= w)
            break;
          if (ny < 0 || ny >= h)
            break;

          if (v.f[ny][nx] == 3) { //??´????????°???
            ans = v.turn + 1;
            break;
          } else if (v.f[ny][nx] == 1) { //?????????
            v.f[ny][nx] = 0;             //?????????????¶???????
            //?????????????????????
            nx -= dx[i];
            ny -= dy[i];
            v.x = nx;
            v.y = ny;
            v.turn++;
            que.push(v);
            break;
          }
        }
      }
      if (ans > 0)
        break;
    }

    printf("%d\\n", ans);
  }
}