Problem p02386 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>

using namespace std;

class Dice {
public:
  int value[6];
  Dice(){};
  Dice(int *num) {
    for (int i = 0; i < 6; i++) {
      Dice::value[i] = num[i];
    }
  }
  void rotate(char direction) {
    int tmp;
    switch (direction) {
    case 'N':
      tmp = Dice::value[0];
      Dice::value[0] = Dice::value[1];
      Dice::value[1] = Dice::value[5];
      Dice::value[5] = Dice::value[4];
      Dice::value[4] = tmp;
      break;

    case 'S':
      for (int i = 0; i < 3; i++)
        Dice::rotate('N');
      break;

    case 'W':
      tmp = Dice::value[0];
      Dice::value[0] = Dice::value[2];
      Dice::value[2] = Dice::value[5];
      Dice::value[5] = Dice::value[3];
      Dice::value[3] = tmp;
      break;

    case 'E':
      for (int i = 0; i < 3; i++)
        Dice::rotate('W');
      break;

    case 'R':
      tmp = Dice::value[1];
      Dice::value[1] = Dice::value[3];
      Dice::value[3] = Dice::value[4];
      Dice::value[4] = Dice::value[2];
      Dice::value[2] = tmp;
      break;

    default:;
    }
  }
};

bool isSame(Dice dice1, Dice dice2) {
  int count = 4;
  if (dice2.value[3] == dice1.value[0])
    dice2.rotate('E');
  if (dice2.value[2] == dice1.value[0])
    dice2.rotate('W');
  while (dice2.value[0] != dice1.value[0] && count-- > 0)
    dice2.rotate('N');
  count = 4;
  while (dice2.value[1] != dice1.value[1] && count-- > 0)
    dice2.rotate('R');
  for (int i = 0; i < 6; i++) {
    if (dice2.value[i] != dice1.value[i]) {
      return false;
    }
  }
  return true;
}

int main() {
  int num[6];
  string result = "Yes";
  int n;
  cin >> n;
  Dice dices[n];
  Dice dicesBase[n];

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 6; j++)
      cin >> num[j];
    dices[i] = Dice(num);
    dicesBase[i] = Dice(num);
  }

  char direction[4] = {'N', 'S', 'W', 'E'};
  for (int j = 1; j < n; j++) {
    for (int i = 0; i < 4; i++) {
      dices[j] = dicesBase[j];
      dices[j].rotate(direction[i]);
      if (isSame(dices[0], dices[j]))
        result = "No";
    }
    dices[j] = dicesBase[j];
    dices[j].rotate('N');
    dices[j].rotate('N');
    if (isSame(dices[0], dices[j]))
      result = "No";
  }

  cout << result << endl;
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

class Dice {
public:
  int value[6];
  Dice(){};
  Dice(int *num) {
    for (int i = 0; i < 6; i++) {
      Dice::value[i] = num[i];
    }
  }
  void rotate(char direction) {
    int tmp;
    switch (direction) {
    case 'N':
      tmp = Dice::value[0];
      Dice::value[0] = Dice::value[1];
      Dice::value[1] = Dice::value[5];
      Dice::value[5] = Dice::value[4];
      Dice::value[4] = tmp;
      break;

    case 'S':
      for (int i = 0; i < 3; i++)
        Dice::rotate('N');
      break;

    case 'W':
      tmp = Dice::value[0];
      Dice::value[0] = Dice::value[2];
      Dice::value[2] = Dice::value[5];
      Dice::value[5] = Dice::value[3];
      Dice::value[3] = tmp;
      break;

    case 'E':
      for (int i = 0; i < 3; i++)
        Dice::rotate('W');
      break;

    case 'R':
      tmp = Dice::value[1];
      Dice::value[1] = Dice::value[3];
      Dice::value[3] = Dice::value[4];
      Dice::value[4] = Dice::value[2];
      Dice::value[2] = tmp;
      break;

    default:;
    }
  }
};

bool isSame(Dice dice1, Dice dice2) {
  if (dice2.value[3] == dice1.value[0])
    dice2.rotate('E');
  if (dice2.value[2] == dice1.value[0])
    dice2.rotate('W');
  while (dice2.value[0] != dice1.value[0])
    dice2.rotate('N');
  while (dice2.value[1] != dice1.value[1])
    dice2.rotate('R');
  for (int i = 0; i < 6; i++) {
    if (dice2.value[i] != dice1.value[i]) {
      return false;
    }
  }
  return true;
}

int main() {
  int num[6];
  string result = "Yes";
  int n;
  cin >> n;
  Dice dices[n];
  Dice dicesBase[n];

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 6; j++)
      cin >> num[j];
    dices[i] = Dice(num);
    dicesBase[i] = Dice(num);
  }

  char direction[4] = {'N', 'S', 'W', 'E'};
  for (int j = 1; j < n; j++) {
    for (int i = 0; i < 4; i++) {
      dices[j] = dicesBase[j];
      dices[j].rotate(direction[i]);
      if (isSame(dices[0], dices[j]))
        result = "No";
    }
    dices[j] = dicesBase[j];
    dices[j].rotate('N');
    dices[j].rotate('N');
    if (isSame(dices[0], dices[j]))
      result = "No";
  }

  cout << result << endl;
  return 0;
}