#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool getmin(T& a, const T& b) {
  return b < a ? (a = b, true) : false;
}
const double INF = (1 << 30);
const double eps = 1e-9;
const unsigned long long base = 4;
inline int dcmp(const double& x) {
  return fabs(x) < eps ? 0 : (x < 0 ? -1 : 1);
}
inline unsigned long long idx(const char& c) {
  if (c == 'R')
    return 1;
  else if (c == 'G')
    return 2;
  else if (c == 'B')
    return 3;
  else
    assert(0);
}
struct Hash {
  static const int hashsize = 4000000 + 5;
  static const int statesize = 4000000 + 5;
  vector<int> vec[hashsize];
  double dp[statesize];
  unsigned long long state[statesize];
  int size;
  inline void init() {
    size = 0;
    for (int i = 0; i < hashsize; i++) vec[i].clear();
  }
  inline bool find(const unsigned long long& x, double& ans) {
    int group = x % hashsize;
    for (int i = 0; i < vec[group].size(); i++)
      if (state[vec[group][i]] == x) {
        ans = dp[vec[group][i]];
        return 1;
      }
    return 0;
  }
  inline void insert(const unsigned long long& x, const double& v) {
    int group = x % hashsize;
    vec[group].push_back(size);
    dp[size] = v;
    state[size++] = x;
  }
} mp;
inline int getid(int a, int b, int c) {
  if (a > c) swap(a, c);
  return (((a << 2) + b) << 2) + c;
}
inline int setblock(int* arr, int state) {
  arr[0] = (state >> 4) & 3;
  arr[1] = (state >> 2) & 3;
  arr[2] = state & 3;
}
int n;
const double prob[4] = {0.0, 1.0 / 6.0, 1.0 / 3.0, 1.0 / 3.0};
const int maxlev = 18 + 5;
int state[maxlev], state2[maxlev];
inline unsigned long long getid(int toplev) {
  for (int i = 0; i <= toplev; i++) state2[i] = state[i];
  sort(state2, state2 + toplev);
  unsigned long long res = 0;
  for (int lev = 0; lev <= toplev; lev++)
    res = res * base * base * base + state2[lev];
  return res;
}
double dp(const unsigned long long& now, const int& toplev) {
  double ans;
  if (mp.find(now, ans)) return ans;
  double coef = 1.0 / 6.0, best[4] = {0.0, INF, INF, INF};
  for (int lev = 0; lev < toplev; lev++) {
    int take[3], give[3], tstate = state[lev], gstate = state[toplev];
    setblock(take, tstate);
    setblock(give, gstate);
    int toputlev = toplev + (give[0] && give[1] && give[2]);
    if (toputlev > toplev) give[0] = give[1] = give[2] = 0;
    for (int i = 0; i < 3; i++)
      if (take[i]) {
        int color = take[i];
        take[i] = 0;
        state[lev] = getid(take[0], take[1], take[2]);
        if ((!!take[0]) + (!!take[1]) + (!!take[2]) == 1 || !take[1])
          state[lev] = 0;
        take[i] = color;
        if ((i == 1 && (take[0] != 0 && take[2] != 0)) ||
            (i != 1 && take[1] != 0))
          for (int j = 0; j < 3; j++)
            if (give[j] == 0) {
              give[j] = color;
              state[toputlev] = getid(give[0], give[1], give[2]);
              give[j] = 0;
              getmin(best[color], dp(getid(toputlev), toputlev));
            }
      }
    state[lev] = tstate;
    state[toplev] = gstate;
  }
  for (int i = 1; i <= 3; i++)
    if (dcmp(best[i] - INF) == 0) coef += prob[i], best[i] = 0.0;
  if (dcmp(coef - 1.0) == 0) {
    mp.insert(now, ans = 0.0);
    return ans;
  }
  mp.insert(now, ans = (best[1] * prob[1] + best[2] * prob[2] +
                        best[3] * prob[3] + 1.0) /
                       (1.0 - coef));
  return ans;
}
int main() {
  mp.init();
  while (scanf("%d", &n) == 1 && n) {
    for (int i = 0; i < n; i++) {
      char s[5];
      scanf("%s", s);
      state[i] = getid(idx(s[0]), idx(s[1]), idx(s[2]));
    }
    printf("%.10f\n", dp(getid(n - 1), n - 1));
  }
}
