#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = v * 10 + c - '0';
  while (isdigit(c = getchar())) v = v * 10 + c - '0';
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = v * 10 + c - '0';
  while (isdigit(c = getchar())) v = v * 10 + c - '0';
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while ((c = getchar()) == ' ' || c == '\n')
    ;
  x = c;
}
inline void writes(string s) { puts(s.c_str()); }
inline void writeln() { writes(""); }
inline void writei(int x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
inline void writell(long long x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
int n, m, i, j, a[15], b[15], x, y, z;
char c;
unsigned long long e = 1e6 + 3;
struct hash_map {
  int nxt[10000005], hd[262144], cnt;
  unsigned long long a[10000005];
  double b[10000005];
  void ins(unsigned long long x, double y) {
    int t = (x & ((1 << 18) - 1));
    nxt[++cnt] = hd[t];
    hd[t] = cnt;
    a[cnt] = x;
    b[cnt] = y;
  }
  double query(unsigned long long x) {
    int t = (x & ((1 << 18) - 1)), i;
    for (i = hd[t]; i; i = nxt[i])
      if (a[i] == x) return b[i];
    return -1;
  }
} g;
int tonum(char c) {
  if (c == 'B') return 1;
  if (c == 'G') return 2;
  if (c == 'R') return 3;
}
int merge(int x, int y, int z) {
  if (x > z) swap(x, z);
  return x * 16 + y * 4 + z;
}
void split(int a[], int x) {
  a[0] = x / 16;
  a[1] = x / 4 % 4;
  a[2] = x % 4;
}
unsigned long long gth(int n) {
  unsigned long long s = 0;
  int i;
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) b[i] = a[i];
  sort(b + 1, b + n);
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) s = s * e + b[i];
  return s;
}
double dfs(int n) {
  unsigned long long cur = gth(n);
  double t = g.query(cur), f[4] = {1e9, 1e9, 1e9, 1e9};
  if (t >= 0) return t;
  int i, j, k;
  for (((i)) = (1); ((i)) <= ((n - 1)); ((i))++) {
    int x[3], y[3], nn = n, mem1 = a[i], mem2 = a[n];
    split(x, a[i]);
    split(y, a[n]);
    if (((bool)x[0]) + ((bool)x[1]) + ((bool)x[2]) == 1) continue;
    if (((bool)x[0]) + ((bool)x[1]) + ((bool)x[2]) <= 2 && !x[1]) continue;
    if (y[0] && y[1] && y[2]) {
      nn++;
      y[0] = y[1] = y[2] = 0;
    }
    for ((j) = (0); (j) <= (2); (j)++)
      if (x[j]) {
        if (((bool)x[0]) + ((bool)x[1]) + ((bool)x[2]) == 2 &&
            (j == 1 || !x[1]))
          continue;
        int t = x[j];
        x[j] = 0;
        a[i] = merge(x[0], x[1], x[2]);
        if (((bool)x[0]) + ((bool)x[1]) + ((bool)x[2]) == 1 || (!x[1]))
          a[i] = 0;
        x[j] = t;
        for ((k) = (0); (k) <= (2); (k)++)
          if (!y[k]) {
            y[k] = t;
            a[nn] = merge(y[0], y[1], y[2]);
            y[k] = 0;
            f[t] = min(f[t], dfs(nn));
          }
      }
    a[i] = mem1;
    a[n] = mem2;
  }
  if (f[1] + 1e3 >= 1e9 && f[2] + 1e3 >= 1e9 && f[3] + 1e3 >= 1e9) {
    g.ins(cur, 0.0);
    return 0.0;
  }
  double p = 1.0 / 6;
  if (f[1] + 1e3 >= 1e9) {
    f[1] = 0;
    p += 2.0 / 6;
  }
  if (f[2] + 1e3 > 1e9) {
    f[2] = 0;
    p += 2.0 / 6;
  }
  if (f[3] + 1e3 > 1e9) {
    f[3] = 0;
    p += 1.0 / 6;
  }
  double ans = (f[1] / 3.0 + f[2] / 3.0 + f[3] / 6.0 + 1.0) / (1.0 - p);
  g.ins(cur, ans);
  return ans;
}
int main() {
  scanf("%d", &n);
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) {
    char c;
    readc(c);
    x = tonum(c);
    readc(c);
    y = tonum(c);
    readc(c);
    z = tonum(c);
    a[i] = merge(x, y, z);
  }
  printf("%.18f\n", dfs(n));
  return 0;
}
