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

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <functional>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
#define INF 1e+8
#define EPS 1e-7
#define PB push_back
#define fi first
#define se second
#define ll long long
#define reps(i, j, k) for (int i = (j); i < (k); i++)
#define rep(i, j) reps(i, 0, j)
typedef pair<int, int> Pii;
typedef vector<int> vi;
class data {
public:
  short field[10][10];
  short cnt;
  data() {}
  data(short _field[10][10], short _cnt) {
    rep(i, 10) {
      rep(j, 10) { field[i][j] = _field[i][j]; }
    }
    cnt = _cnt;
  }
};
bool memo[10][10];
short chenge(char c) {
  if (c == 'R')
    return 0;
  if (c == 'G')
    return 1;
  return 2;
}
bool check(short f[10][10], short W, short H) {
  short comp = f[0][0];
  rep(i, H) {
    rep(j, W) {
      if (comp != f[i][j])
        return false;
    }
  }
  return true;
}
void dfs(short b, short col, short y, short x, short stage[10][10], short W,
         short H) {
  rep(i, 4) {
    short ny = y + dy[i];
    short nx = x + dx[i];
    if (ny < 0 || ny > H - 1 || nx < 0 || nx > W - 1 || stage[ny][nx] != b)
      continue;
    if (memo[ny][nx]++)
      continue;
    stage[ny][nx] = col;
    dfs(b, col, ny, nx, stage, W, H);
  }
  return;
}
void copy(short stage[10][10], short bef[10][10], short W, short H) {
  rep(i, H) {
    rep(j, W) { stage[i][j] = bef[i][j]; }
  }
  return;
}
int main() {
  int W, H;
  while (scanf("%d%d", &W, &H), W) {
    short stage[10][10];
    rep(i, H) {
      rep(j, W) {
        char c;
        scanf(" %c", &c);
        stage[i][j] = chenge(c);
      }
    }
    queue<data> Q;
    Q.push(data(stage, 0));
    short ans = -1;
    while (!Q.empty()) {
      data d = Q.front();
      Q.pop();
      /*
              puts("-----------------------------");
              rep(i,H){
                  rep(j,W){
                      printf("%d ",d.field[i][j]);
                  }
                  puts("");
              }
              puts("-----------------------------");*/
      if (check(d.field, W, H)) {
        ans = d.cnt;
        break;
      }
      short col1 = (d.field[0][0] + 1) % 3;
      short col2 = (d.field[0][0] + 2) % 3;
      short sub[10][10];
      copy(sub, d.field, W, H);
      memset(memo, 0, sizeof(memo));
      sub[0][0] = col1;
      dfs(d.field[0][0], col1, 0, 0, sub, W, H);
      Q.push(data(sub, d.cnt + 1));
      copy(sub, d.field, W, H);
      memset(memo, 0, sizeof(memo));
      sub[0][0] = col2;
      dfs(d.field[0][0], col2, 0, 0, sub, W, H);
      Q.push(data(sub, d.cnt + 1));
    }
    printf("%d\\n", ans);
  }
  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <functional>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
#define INF 1e+8
#define EPS 1e-7
#define PB push_back
#define fi first
#define se second
#define ll long long
#define reps(i, j, k) for (int i = (j); i < (k); i++)
#define rep(i, j) reps(i, 0, j)
typedef pair<int, int> Pii;
typedef vector<int> vi;
class data {
public:
  short field[11][11];
  int cnt;
  data() {}
  data(short _field[11][11], int _cnt) {
    rep(i, 10) {
      rep(j, 10) { field[i][j] = _field[i][j]; }
    }
    cnt = _cnt;
  }
};
bool memo[11][11];
int chenge(char c) {
  if (c == 'R')
    return 0;
  if (c == 'G')
    return 1;
  return 2;
}
bool check(short f[11][11], int W, int H) {
  int comp = f[0][0];
  rep(i, H) {
    rep(j, W) {
      if (comp != f[i][j])
        return false;
    }
  }
  return true;
}
void dfs(int b, int col, int y, int x, short stage[11][11], int W, int H) {
  rep(i, 4) {
    int ny = y + dy[i];
    int nx = x + dx[i];
    if (ny < 0 || ny > H - 1 || nx < 0 || nx > W - 1 || stage[ny][nx] != b)
      continue;
    if (memo[ny][nx]++)
      continue;
    stage[ny][nx] = col;
    dfs(b, col, ny, nx, stage, W, H);
  }
  return;
}
void copy(short stage[11][11], short bef[11][11], int W, int H) {
  rep(i, H) {
    rep(j, W) { stage[i][j] = bef[i][j]; }
  }
  return;
}
int main() {
  int W, H;
  while (scanf("%d%d", &W, &H), W) {
    short stage[11][11];
    rep(i, H) {
      rep(j, W) {
        char c;
        scanf(" %c", &c);
        stage[i][j] = chenge(c);
      }
    }
    queue<data> Q;
    Q.push(data(stage, 0));
    int ans = -1;
    while (!Q.empty()) {
      data d = Q.front();
      Q.pop();
      /*
              puts("-----------------------------");
              rep(i,H){
                  rep(j,W){
                      printf("%d ",d.field[i][j]);
                  }
                  puts("");
              }
              puts("-----------------------------");*/
      if (check(d.field, W, H)) {
        ans = d.cnt;
        break;
      }
      int col1 = (d.field[0][0] + 1) % 3;
      int col2 = (d.field[0][0] + 2) % 3;
      short sub[11][11];
      copy(sub, d.field, W, H);
      memset(memo, 0, sizeof(memo));
      sub[0][0] = col1;
      dfs(d.field[0][0], col1, 0, 0, sub, W, H);
      Q.push(data(sub, d.cnt + 1));
      copy(sub, d.field, W, H);
      memset(memo, 0, sizeof(memo));
      sub[0][0] = col2;
      dfs(d.field[0][0], col2, 0, 0, sub, W, H);
      Q.push(data(sub, d.cnt + 1));
    }
    printf("%d\\n", ans);
  }
  return 0;
}