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

#include <cstring>
#include <iostream>
#include <queue>
#include <stdlib.h>
#define MAX_NUM 1010
using namespace std;
int H, W, N;
bool flag[MAX_NUM][MAX_NUM] = {false}; //??是否已遍??
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

class Node {
public:
  Node();
  Node(int x, int y, int step);
  ~Node();
  int x;
  int y;
  int step;
};

Node::Node() {}

Node::Node(int x, int y, int step) {
  this->x = x;
  this->y = y;
  this->step = step;
}

Node::~Node() {}

int BFS(char map[][MAX_NUM], int sx, int sy, int ex, int ey) {
  queue<Node> que; // 第一次出?Memory Limit Exceeded,一定不能使用new来?行?建
  Node node(sx, sy, 0);
  que.push(node);
  flag[sx][sy] = true; // 将遍?的?点?置?true

  while (!que.empty()) {
    Node cur = que.front();
    que.pop();

    if (cur.x == ex && cur.y == ey) {
      return cur.step;

    } else {
      for (int i = 0; i < 4; i++) {
        int k = cur.x + dir[i][0];
        int v = cur.y + dir[i][1];

        if (k >= 0 && k < H && v >= 0 && v < W && map[k][v] != 'X' &&
            !flag[k][v]) { // 将可到?并且尚未遍?的?点加入?列
          Node temp(k, v, cur.step + 1);
          que.push(temp);
          flag[k][v] = true;
        }
      }
    }
  }

  return -1;
}

int main() {
  int sx, sy, arr[10][2];
  char map[MAX_NUM][MAX_NUM];

  if (cin >> H >> W >> N && H && W) {
    for (int i = 0; i < H; i++) {
      for (int j = 0; j < W; j++) {
        cin >> map[i][j];

        if (map[i][j] == 'S') {
          map[i][j] = '.';
          sx = i;
          sy = j;
        }

        if (isdigit(map[i][j])) {
          int index = map[i][j] - '0';
          arr[index][0] = i;
          arr[index][1] = j;
        }
      }
    }

    arr[0][0] = sx;
    arr[0][1] = sy;
    int res = 0;

    for (int i = 0; i + 1 <= N; i++) {
      memset(flag, false, sizeof(flag));
      res += BFS(map, arr[i][0], arr[i][1], arr[i + 1][0], arr[i + 1][1]);
    }

    cout << res << endl;
  }

  return 0;
}

Error: MLE

Fixed submission:

#include <cctype>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

struct State {
  int step;
  int x;
  int y;

  State() {
    step = 0;
    x = 0;
    y = 0;
  }

  State(int step, int x, int y) : step(step), x(x), y(y) {}

  ~State() {}
};

const int MAX_N = 1000;
const int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
char board[MAX_N][MAX_N];
int W, H, N;
State pos[10];

void init();
void input();
void solve();
int bfs(State from, State to);
void findPossition();

int main() {
#ifdef LOCAL
  freopen("data.in", "r", stdin);
  freopen("data.out", "w", stdout);
#endif
  init();
  input();
  solve();
  return 0;
}

void init() {}

void input() {
  scanf("%d %d %d", &H, &W, &N);

  for (int i = 0; i < H; i++) {
    scanf("%s", board[i]);
  }
}

void solve() {
  int moves = 0;
  findPossition();

  for (int i = 0; i < N; i++) {
    moves += bfs(pos[i], pos[i + 1]);
  }

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

int bfs(State from, State to) {
  queue<State> que;
  bool visit[H][W];
  State cur = from;

  for (int i = 0; i < H; i++) {
    memset(visit[i], false, sizeof(visit[i]));
  }

  que.push(cur);
  visit[cur.x][cur.y] = true;

  while (!que.empty()) {
    cur = que.front();
    que.pop();

    for (int i = 0; i < 4; i++) {
      int x = cur.x + dir[i][0];
      int y = cur.y + dir[i][1];

      if (x < 0 || x >= H || y < 0 || y >= W || visit[x][y] ||
          'X' == board[x][y]) {
        continue;
      }

      que.push(State(cur.step + 1, x, y));
      visit[cur.x][cur.y] = true;

      if (x == to.x && y == to.y) {
        return cur.step + 1;
      }
    }
  }

  return 0;
}

void findPossition() {
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      int c = board[i][j];

      if ('S' == c) {
        pos[0] = State(0, i, j);
      }

      if (isdigit(c)) {
        pos[c - '0'] = State(0, i, j);
      }
    }
  }
}