#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;
constexpr ull none = 0, red = 1, blue = 2, green = 3;
ull sort(ull x) {
  unsigned x0 = (x >> ((0) + 1) * 6) & 0b111111;
  unsigned x1 = (x >> ((1) + 1) * 6) & 0b111111;
  unsigned x2 = (x >> ((2) + 1) * 6) & 0b111111;
  unsigned x3 = (x >> ((3) + 1) * 6) & 0b111111;
  unsigned x4 = (x >> ((4) + 1) * 6) & 0b111111;
  unsigned x5 = (x >> ((5) + 1) * 6) & 0b111111;
  unsigned x6 = (x >> ((6) + 1) * 6) & 0b111111;
  unsigned x7 = (x >> ((7) + 1) * 6) & 0b111111;
  do {
    unsigned temp = ((x0 ^ x1) & -(x0 < x1));
    x0 ^= temp;
    x1 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x2 ^ x3) & -(x2 < x3));
    x2 ^= temp;
    x3 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x4 ^ x5) & -(x4 < x5));
    x4 ^= temp;
    x5 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x6 ^ x7) & -(x6 < x7));
    x6 ^= temp;
    x7 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x0 ^ x2) & -(x0 < x2));
    x0 ^= temp;
    x2 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x1 ^ x3) & -(x1 < x3));
    x1 ^= temp;
    x3 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x4 ^ x6) & -(x4 < x6));
    x4 ^= temp;
    x6 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x5 ^ x7) & -(x5 < x7));
    x5 ^= temp;
    x7 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x1 ^ x2) & -(x1 < x2));
    x1 ^= temp;
    x2 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x5 ^ x6) & -(x5 < x6));
    x5 ^= temp;
    x6 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x0 ^ x4) & -(x0 < x4));
    x0 ^= temp;
    x4 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x3 ^ x7) & -(x3 < x7));
    x3 ^= temp;
    x7 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x1 ^ x5) & -(x1 < x5));
    x1 ^= temp;
    x5 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x2 ^ x6) & -(x2 < x6));
    x2 ^= temp;
    x6 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x1 ^ x4) & -(x1 < x4));
    x1 ^= temp;
    x4 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x3 ^ x6) & -(x3 < x6));
    x3 ^= temp;
    x6 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x2 ^ x4) & -(x2 < x4));
    x2 ^= temp;
    x4 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x3 ^ x5) & -(x3 < x5));
    x3 ^= temp;
    x5 ^= temp;
  } while (0);
  do {
    unsigned temp = ((x3 ^ x4) & -(x3 < x4));
    x3 ^= temp;
    x4 ^= temp;
  } while (0);
  x &= 0b111111;
  (x |= (ull)x0 << ((0 + 1) * 6));
  (x |= (ull)x1 << ((1 + 1) * 6));
  (x |= (ull)x2 << ((2 + 1) * 6));
  (x |= (ull)x3 << ((3 + 1) * 6));
  (x |= (ull)x4 << ((4 + 1) * 6));
  (x |= (ull)x5 << ((5 + 1) * 6));
  (x |= (ull)x6 << ((6 + 1) * 6));
  (x |= (ull)x7 << ((7 + 1) * 6));
  return x;
}
unsigned encode(char l, char c, char r) {
  unsigned vl = l == 'R' ? red : l == 'G' ? green : blue;
  unsigned vc = c == 'R' ? red : c == 'G' ? green : blue;
  unsigned vr = r == 'R' ? red : r == 'G' ? green : blue;
  if (vl > vr) swap(vl, vr);
  return (vc << 4) | (vl << 2) | vr;
}
std::unordered_map<ull, double> dp;
double solve(ull tower);
double solve(ull tower, unsigned put) {
  if ((tower & 0b11) && (tower & 0b1100) && (tower & 0b110000)) {
    tower = sort(tower) << 6;
  }
  double best = 1e9;
  if (!(tower & 0b110000)) best = min(best, solve(tower | (put << 4)));
  if (!(tower & 0b1100)) best = min(best, solve(tower | (put << 2)));
  if (!(tower & 0b11)) best = min(best, solve(tower | put));
  return best;
}
double solve(ull tower) {
  if (!(tower & ~0b111111ull)) return 0.0;
  tower = sort(tower);
  {
    auto ite = dp.find(tower);
    if (ite != dp.end()) return ite->second;
  }
  double ans = 0;
  int progress = 0;
  for (unsigned i = red; i <= green; i++) {
    if (!(((((tower >> 6) ^ (~0ull / 3 * (i))) - (~0ull / 3)) &
           ~((tower >> 6) ^ (~0ull / 3 * (i))) & (~0ull / 3 * 2))))
      continue;
    double best = 1e9;
    for (int j = 6; tower & (0b111111ull << j); j += 6) {
      if (((tower >> j) & 0b11) == i) {
        best = min(best, solve(tower & ~(0b110011ull << j), i));
      }
      if (((tower >> (j + 2)) & 0b11) == i) {
        ull x = ~(0b111111ull << j);
        ull y = ((tower >> j) & 0b11) << (j + 2);
        best = min(best, solve((tower & x) | y, i));
      }
      if (((tower >> (j + 4)) & 0b11) == i) {
        best = min(best, solve(tower & ~(0b111111ull << j), i));
      }
    }
    ans += best * (i == red ? 1 : 2);
    progress += (i == red ? 1 : 2);
  }
  ans = (ans + 6) / progress;
  dp.insert(make_pair(tower, ans));
  return ans;
}
int main() {
  int n;
  while (scanf("%d", &n) == 1) {
    ull tower = 0;
    for (int i = n - 1; i >= 0; i--) {
      char s[4];
      scanf("%s", s);
      tower |= (ull)encode(s[0], s[1], s[2]) << (i * 6);
    }
    printf("%.15f\n", solve(tower));
  }
}
