#include <bits/stdc++.h>
using namespace std;
const char R = 0;
const char G = 1;
const char B = 2;
const char EMPTY = 3;
const long double INF = 1e10;
inline char code(char c) {
  if (c == 'R') return R;
  if (c == 'G') return G;
  if (c == 'B') return B;
  return EMPTY;
}
struct State {
  char count[3][3][3];
  char have[3];
  char top[3];
  State() { memset(this, 0, sizeof(State)); }
  inline bool moveTop() {
    if (topFilled()) {
      count[top[0]][top[1]][top[2]]++;
      top[0] = top[1] = top[2] = EMPTY;
      return true;
    }
    return false;
  }
  inline bool topFilled() const {
    return top[0] != EMPTY && top[1] != EMPTY && top[2] != EMPTY;
  }
};
inline bool operator<(const State& s1, const State& s2) {
  return memcmp(&s1, &s2, sizeof(State)) < 0;
}
map<State, long double> dp;
long double DP(State& s);
long double tryPlace(State& s, char drop) {
  char t0 = s.top[0];
  char t1 = s.top[1];
  char t2 = s.top[2];
  bool moved = s.moveTop();
  long double best = INF;
  for (int i = 0; i < (3); ++i)
    if (s.top[i] == EMPTY) {
      s.top[i] = drop;
      best = min(best, DP(s));
      s.top[i] = EMPTY;
    }
  if (moved) {
    s.count[t0][t1][t2]--;
    s.top[0] = t0;
    s.top[1] = t1;
    s.top[2] = t2;
  }
  return best;
}
long double DP(State& s) {
  auto it = dp.find(s);
  if (it != dp.end()) {
    return it->second;
  }
  int self = 1;
  long double e = 0.0;
  for (int drop = 0; drop < 3; ++drop) {
    int count = (drop == R) ? 1 : 2;
    long double best = INF;
    if (s.have[drop] > 0) {
      s.have[drop]--;
      best = tryPlace(s, drop);
      s.have[drop]++;
    }
    for (int a = 0; a < (3); ++a)
      for (int b = 0; b < (3); ++b)
        for (int c = 0; c < (3); ++c) {
          if (s.count[a][b][c] > 0 && (a == drop || b == drop || c == drop)) {
            s.count[a][b][c]--;
            if (a == drop) {
              s.have[c]++;
              best = min(best, tryPlace(s, drop));
              s.have[c]--;
            }
            if (b == drop) {
              best = min(best, tryPlace(s, drop));
            }
            if (c == drop && a != drop) {
              s.have[a]++;
              best = min(best, tryPlace(s, drop));
              s.have[a]--;
            }
            s.count[a][b][c]++;
          }
        }
    if (best > 1e9) {
      self += count;
    } else {
      e += count * best;
    }
  }
  if (self == 6) {
    return dp[s] = 0.0;
  }
  return dp[s] = (1 + e / 6.0) / (1.0 - self / 6.0);
}
string input[] = {"RGB", "GRG", "BBB", "GGR", "BRG", "BRB"};
int main() {
  State init;
  int n = 6;
  cin >> n;
  string s;
  for (int i = 0; i < (n - 1); ++i) {
    cin >> s;
    for (int j = 0; j < (3); ++j) s[j] = code(s[j]);
    init.count[s[0]][s[1]][s[2]]++;
  }
  s = input[n - 1];
  cin >> s;
  for (int j = 0; j < (3); ++j) init.top[j] = code(s[j]);
  cout << fixed << setprecision(12) << (double)DP(init) << endl;
  return 0;
}
