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

#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <typeinfo>
#include <utility>
#include <vector>

using namespace std;

#define dump(n) cout << "# " << #n << "=" << (n) << endl
#define debug(n)                                                               \\
  cout << __FILE__ << "," << __LINE__ << ": #" << #n << "=" << (n) << endl
#define repi(i, a, b) for (int i = int(a); i < int(b); i++)
#define rep(i, n) repi(i, 0, n)
#define iter(c) __typeof((c).begin())
#define foreach(i, c) for (iter(c) i = (c).begin(); i != (c).end(); i++)
#define allof(c) (c).begin(), (c).end()
#define mp make_pair

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<int, int> pii;

int main() {
  for (int w, h; cin >> w >> h, w | h;) {
    vvi field(h, vi(w));
    rep(i, h) rep(j, w) cin >> field[i][j];

    vector<pii> homes;
    int counter = 0;
    rep(i, h) rep(j, w) {
      if (field[i][j] == 1) {
        field[i][j] = ++counter;
        homes.push_back(mp(i, j));
      } else if (field[i][j] == 2) {
        field[i][j] = 0;
        homes.insert(homes.begin(), mp(i, j));
      } else
        field[i][j] = -1;
    }

    map<pair<int, int>, int> m;
    m[mp(1, 0)] = 1;
    foreach (iter, m) {
      m.erase(m.begin(), iter);

      int state = iter->first.first;
      int prev = iter->first.second;
      if (state == (1 << homes.size()) - 1)
        break;

      const int di[] = {-1, 1, 0, 0};
      const int dj[] = {0, 0, -1, 1};
      rep(i, 4) {
        int pi = homes[prev].first, pj = homes[prev].second;
        for (;;) {
          pi += di[i];
          pj += dj[i];
          if (pi < 0 || h <= pi || pj < 0 || w <= pj)
            break;
          int homei = field[pi][pj];
          if (homei >= 1) {
            if (state & (1 << homei))
              continue;
            else {
              m[mp(state | (1 << homei), homei)] += iter->second;
              break;
            }
          }
        }
      }
    }
    int res = 0;
    for (iter(m) iter = m.lower_bound(mp((1 << homes.size()) - 1, 0));
         iter != m.end(); iter++) {
      int prev = iter->first.second;
      int pi = homes[prev].first, pj = homes[prev].second;
      if (pi == homes[0].first || pj == homes[0].second)
        res += iter->second;
    }
    cout << res << endl;
  }

  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <typeinfo>
#include <utility>
#include <vector>

using namespace std;

#define dump(n) cout << "# " << #n << "=" << (n) << endl
#define debug(n)                                                               \\
  cout << __FILE__ << "," << __LINE__ << ": #" << #n << "=" << (n) << endl
#define repi(i, a, b) for (int i = int(a); i < int(b); i++)
#define rep(i, n) repi(i, 0, n)
#define iter(c) __typeof((c).begin())
#define foreach(i, c) for (iter(c) i = (c).begin(); i != (c).end(); i++)
#define allof(c) (c).begin(), (c).end()
#define mp make_pair

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<int, int> pii;

string to_binary(int n) {
  if (n == 0)
    return "0";
  string res;
  while (n) {
    res += '0' + (n & 1);
    n >>= 1;
  }
  return res;
}

int main() {
  for (int w, h; cin >> w >> h, w | h;) {
    vvi field(h, vi(w));
    rep(i, h) rep(j, w) cin >> field[i][j];

    vector<pii> homes;
    int counter = 0;
    rep(i, h) rep(j, w) {
      if (field[i][j] == 1) {
        field[i][j] = ++counter;
        homes.push_back(mp(i, j));
      } else if (field[i][j] == 2) {
        field[i][j] = 0;
        homes.insert(homes.begin(), mp(i, j));
      } else
        field[i][j] = -1;
    }

    map<pair<int, int>, int> m;
    m[mp(1, 0)] = 1;
    foreach (iter, m) {
      int state = iter->first.first;
      int prev = iter->first.second;
      if (state == (1 << homes.size()) - 1)
        break;
      const int di[] = {-1, 1, 0, 0};
      const int dj[] = {0, 0, -1, 1};
      rep(i, 4) {
        int pi = homes[prev].first, pj = homes[prev].second;
        for (;;) {
          pi += di[i];
          pj += dj[i];
          if (pi < 0 || h <= pi || pj < 0 || w <= pj)
            break;
          int homei = field[pi][pj];
          if (homei >= 1) {
            if (state & (1 << homei))
              continue;
            else {
              m[mp(state | (1 << homei), homei)] += iter->second;
              break;
            }
          }
        }
      }
    }
    int res = 0;
    for (iter(m) iter = m.lower_bound(mp((1 << homes.size()) - 1, 0));
         iter != m.end(); iter++) {
      int prev = iter->first.second;
      int pi = homes[prev].first, pj = homes[prev].second;
      if (pi == homes[0].first || pj == homes[0].second)
        res += iter->second;
    }
    cout << res << endl;
  }

  return 0;
}