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

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

typedef long long int64;
const int INF = 1 << 30;

vector<int> edge[13];

bool back(string str, int cnt) { // 枝刈り大事だな
  int X[] = {2, 1, 2, 3, 0, 1, 2, 3, 4, 1, 2, 3, 2};
  int Y[] = {0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4};

  int diff = 0;
  for (int i = 0; i < 13; i++) {
    if (str[i] != '0') {
      int pos = (str[i] >= 'A' ? str[i] - 'A' + 10 : str[i] - '0');
      diff += abs(X[pos] - X[i]) + abs(Y[pos] - Y[i]);
    }
  }
  return diff + cnt > 20;
}

int bfs(string mas) {

  queue<string> que;
  map<string, int> memo;
  que.push(mas);
  memo[mas] = 0;
  while (!que.empty()) {

    string p = que.front();
    que.pop();
    if (back(p, memo[p]))
      continue;
    if (p == "0123456789AB0")
      return memo[p];

    for (int i = 0; i < 13; i++) {
      if (p[i] == '0') {
        for (int j = 0; j < edge[i].size(); j++) {
          string next = p;
          swap(next[i], next[edge[i][j]]);
          if (memo.find(next) != memo.end())
            continue;
          que.push(next);
          memo[next] = memo[p] + 1;
        }
      }
    }
  }
  return -1;
}

int main() {
  vector<int> mas(13);

  edge[0].push_back(2);
  edge[1].push_back(2);
  edge[1].push_back(5);
  edge[2].push_back(0);
  edge[2].push_back(1);
  edge[2].push_back(3);
  edge[2].push_back(6);
  edge[3].push_back(2);
  edge[3].push_back(7);
  edge[4].push_back(5);
  edge[5].push_back(1);
  edge[5].push_back(4);
  edge[5].push_back(6);
  edge[5].push_back(9);
  edge[6].push_back(2);
  edge[6].push_back(5);
  edge[6].push_back(7);
  edge[6].push_back(10);
  edge[7].push_back(3);
  edge[7].push_back(6);
  edge[7].push_back(8);
  edge[7].push_back(11);
  edge[8].push_back(7);
  edge[9].push_back(5);
  edge[9].push_back(10);
  edge[10].push_back(6);
  edge[10].push_back(9);
  edge[10].push_back(11);
  edge[10].push_back(12);
  edge[11].push_back(7);
  edge[11].push_back(10);
  edge[12].push_back(10);

  while (cin >> mas[0], mas[0] != -1) {
    for (int i = 1; i < 13; i++) {
      cin >> mas[i];
    }

    string start = "";
    for (int i = 0; i < 13; i++) {
      if (mas[i] >= 10)
        start += (char)(mas[i] - 10 + 'A');
      else
        start += mas[i] + '0';
    }
    int ret = bfs(start);
    if (~ret)
      cout << ret << endl;
    else
      cout << "NA" << endl;
  }
}

Error: MLE

Fixed submission:

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

typedef long long int64;
const int INF = 1 << 30;

vector<int> edge[13];
map<string, int> memo;

bool back(string str, int cnt) { // 枝刈り大事だな
  static int dist[] = {0, 2, 1, 2, 4, 3, 2, 3, 4, 2, 1, 2, 0};
  static int fuee[] = {2, 0, 1, 2, 2, 1, 2, 3, 4, 2, 3, 4, 4};
  static int fuga[] = {1, 1, 0, 1, 3, 2, 1, 2, 3, 3, 2, 3, 3};
  static int haaa[] = {2, 2, 1, 0, 4, 3, 2, 1, 2, 4, 3, 2, 4};
  static int kira[] = {3, 3, 2, 3, 3, 2, 1, 2, 3, 1, 0, 1, 1};

  if (cnt > 20)
    return true;
  int foo1 = 0, foo2 = 0, foo3 = 0, foo4 = 0, foo5 = 0;
  for (int i = 0; i < 13; i++) {
    if (str[i] == '0')
      foo1 += dist[i];
    else if (str[i] == '1')
      foo2 += fuee[i];
    else if (str[i] == '2')
      foo3 += fuga[i];
    else if (str[i] == '3')
      foo4 += haaa[i];
    else if (str[i] == 'A')
      foo5 += kira[i];
  }
  return cnt + foo1 + foo2 + foo3 + foo4 + foo5 > 28;
}

int bfs(string mas) {

  queue<string> que;
  map<string, int> used;
  que.push(mas);
  memo[mas] = 0;
  while (!que.empty()) {

    string p = que.front();
    que.pop();
    if (back(p, memo[p]))
      continue;
    if (p == "0123456789AB0")
      return memo[p];

    for (int i = 0; i < 13; i++) {
      if (p[i] == '0') {
        for (int j = 0; j < edge[i].size(); j++) {
          string next = p;
          swap(next[i], next[edge[i][j]]);
          if (memo.find(next) != memo.end())
            continue;
          que.push(next);
          memo[next] = memo[p] + 1;
        }
      }
    }
  }
  return -1;
}

int main() {
  vector<int> mas(13);

  edge[0].push_back(2);
  edge[1].push_back(2);
  edge[1].push_back(4);
  edge[2].push_back(0);
  edge[2].push_back(1);
  edge[2].push_back(3);
  edge[2].push_back(6);
  edge[3].push_back(2);
  edge[3].push_back(7);
  edge[4].push_back(5);
  edge[5].push_back(1);
  edge[5].push_back(4);
  edge[5].push_back(6);
  edge[5].push_back(9);
  edge[6].push_back(2);
  edge[6].push_back(5);
  edge[6].push_back(7);
  edge[6].push_back(10);
  edge[7].push_back(3);
  edge[7].push_back(6);
  edge[7].push_back(8);
  edge[7].push_back(11);
  edge[8].push_back(7);
  edge[9].push_back(5);
  edge[9].push_back(10);
  edge[10].push_back(6);
  edge[10].push_back(9);
  edge[10].push_back(11);
  edge[10].push_back(12);
  edge[11].push_back(7);
  edge[11].push_back(10);
  edge[12].push_back(10);

  while (cin >> mas[0], mas[0] != -1) {
    for (int i = 1; i < 13; i++) {
      cin >> mas[i];
    }

    string start = "";
    for (int i = 0; i < 13; i++) {
      if (mas[i] >= 10)
        start += (char)(mas[i] - 10 + 'A');
      else
        start += mas[i] + '0';
    }
    int ret = bfs(start);
    if (~ret)
      cout << ret << endl;
    else
      cout << "NA" << endl;

    memo.clear();
  }
}