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

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

struct grid {
  char g[12][12];
  int cost;
};

void paint(grid &gr, char l_u_cell, char changecolor, int p_x, int p_y) {
  if (gr.g[p_y][p_x] != l_u_cell) {
    return;
  }
  gr.g[p_y][p_x] = changecolor;
  paint(gr, l_u_cell, changecolor, p_x + 1, p_y);
  paint(gr, l_u_cell, changecolor, p_x - 1, p_y);
  paint(gr, l_u_cell, changecolor, p_x, p_y + 1);
  paint(gr, l_u_cell, changecolor, p_x, p_y - 1);
}
bool chacker(grid &gr, char l_u_cell, int X, int Y) {
  bool flag = true;
  for (int i = 1; i <= Y; i++) {
    for (int j = 1; j <= X; j++) {
      if (l_u_cell != gr.g[i][j]) {
        flag = false;
        break;
      }
    }
  }
  return flag;
}

int main() {
  while (1) {
    int X, Y;
    cin >> X >> Y;
    if (X == 0 && Y == 0)
      break;
    grid first;
    for (int i = 1; i <= Y; i++) {
      for (int j = 1; j <= X; j++) {
        cin >> first.g[i][j];
      }
    }

    first.cost = 0;
    queue<grid> que;
    que.push(first);

    while (1) {
      grid Grid = que.front();
      que.pop();
      char l_u_cell;
      l_u_cell = Grid.g[1][1];
      if (chacker(Grid, l_u_cell, X, Y)) {
        cout << Grid.cost << endl;
        break;
      }
      if (l_u_cell != 'R') {
        grid tmp = Grid;
        tmp.cost = tmp.cost + 1;
        paint(tmp, l_u_cell, 'R', 1, 1);
        que.push(tmp);
      }
      if (l_u_cell != 'G') {
        grid tmp = Grid;
        tmp.cost = tmp.cost + 1;
        paint(tmp, l_u_cell, 'G', 1, 1);
        que.push(tmp);
      }
      if (l_u_cell != 'B') {
        grid tmp = Grid;
        tmp.cost = tmp.cost + 1;
        paint(tmp, l_u_cell, 'B', 1, 1);
        que.push(tmp);
      }
    }
  }
  return 0;
}


Error: MLE

Fixed submission:

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

struct grid {
  char g[12][12];
  int cost;
};

void paint(grid gr, char l_u_cell, char changecolor, int p_x, int p_y) {
  if (gr.g[p_y][p_x] != l_u_cell) {
    return;
  }
  gr.g[p_y][p_x] = changecolor;
  paint(gr, l_u_cell, changecolor, p_x + 1, p_y);
  paint(gr, l_u_cell, changecolor, p_x - 1, p_y);
  paint(gr, l_u_cell, changecolor, p_x, p_y + 1);
  paint(gr, l_u_cell, changecolor, p_x, p_y - 1);
}
bool chacker(grid gr, char l_u_cell, int X, int Y) {
  bool flag = true;
  for (int i = 1; i <= Y; i++) {
    for (int j = 1; j <= X; j++) {
      if (l_u_cell != gr.g[i][j]) {
        flag = false;
        break;
      }
    }
  }
  return flag;
}

int main() {
  while (1) {
    int X, Y;
    cin >> X >> Y;
    if (X == 0 && Y == 0)
      break;
    grid first;
    for (int i = 1; i <= Y; i++) {
      for (int j = 1; j <= X; j++) {
        cin >> first.g[i][j];
      }
    }

    first.cost = 0;
    queue<grid> que;
    que.push(first);

    while (1) {
      grid Grid = que.front();
      que.pop();
      char l_u_cell;
      l_u_cell = Grid.g[1][1];
      if (chacker(Grid, l_u_cell, X, Y)) {
        cout << Grid.cost << endl;
        break;
      }
      if (l_u_cell != 'R') {
        grid tmp = Grid;
        tmp.cost = tmp.cost + 1;
        paint(tmp, l_u_cell, 'R', 1, 1);
        que.push(tmp);
      }
      if (l_u_cell != 'G') {
        grid tmp = Grid;
        tmp.cost = tmp.cost + 1;
        paint(tmp, l_u_cell, 'G', 1, 1);
        que.push(tmp);
      }
      if (l_u_cell != 'B') {
        grid tmp = Grid;
        tmp.cost = tmp.cost + 1;
        paint(tmp, l_u_cell, 'B', 1, 1);
        que.push(tmp);
      }
    }
  }
  return 0;
}