func_code_string: #include <bits/stdc++.h>   using namespace std;   const long double INF = 1e9;   vector<tuple<int, int, int> > v;   map<pair<long long, tuple<int, int, int> >, long double> mp;   vector<int> e[31][4];   long double pb[] = {1.0 / 6, 1.0 / 6, 1.0 / 3, 1.0 / 3};   int get_pos(vector<tuple<int, int, int> > v, tuple<int, int, int> p) {     return int(lower_bound(v.begin(), v.end(), p) - v.begin());   }   tuple<int, int, int> good_tp(int a, int b, int c) {     if (a > c) swap(a, c);     return tuple<int, int, int>(a, b, c);   }   long long to_num(int a[]) {     int b[8];     for (int i = 0; i < 8; i++) b[i] = a[i];     sort(b, b + 8);     long long r = 0;     for (int i = 0; i < 8; i++) {       r *= 22;       r += b[i];     }     return r;   }   long double ask(pair<long long, tuple<int, int, int> > x) {     if (mp.find(x) != mp.end())       return mp[x];     else {       long long p = x.first;       int a = get<0>(x.second);       int b = get<1>(x.second);       int c = get<2>(x.second);       int id = get_pos(v, x.second);       int A = a, B = b, C = c;       if (A && B && C) A = B = C = 0;       int num[8];       for (int i = 7; i >= 0; i--) num[i] = p % 22, p /= 22;       long double unchanged = pb[0];       bool OK = false;       long double sum = 1;       for (int i = 1; i <= 3; i++) {         bool flag = false;         long double mn = INF;         for (int j = 0; j < 8; j++) {           int t = num[j];           for (int x : e[t][i]) {             flag = true;             OK = true;             num[j] = x;             if (A != a) num[0] = id;             long long next_num = to_num(num);             if (A != a) num[0] = 0;             tuple<int, int, int> next_tp;             if (!A) {               next_tp = good_tp(i, B, C);               mn = min(mn, ask(pair<long long, tuple<int, int, int> >(next_num,                                                                       next_tp)));             }             if (!B) {               next_tp = good_tp(A, i, C);               mn = min(mn, ask(pair<long long, tuple<int, int, int> >(next_num,                                                                       next_tp)));             }             if (!C) {               next_tp = good_tp(A, B, i);               mn = min(mn, ask(pair<long long, tuple<int, int, int> >(next_num,                                                                       next_tp)));             }             num[j] = t;           }         }         if (!flag)           unchanged += pb[i];         else {           sum += pb[i] * mn;         }       }       if (!OK)         return mp[x] = 0;       else {         return mp[x] = sum / (1 - unchanged);         puts( oao );       }     }   }   int char_to_int(char c) {     if (c ==  R )       return 1;     else if (c ==  G )       return 2;     else       return 3;   }   int main() {     for (int i = 0; i <= 3; i++) {       v.emplace_back(0, 0, i);       if (i) e[i][i].push_back(0);     }     int m = 4;     for (int i = 1; i <= 3; i++)       for (int j = 1; j <= 3; j++)         for (int k = i; k <= 3; k++) {           v.emplace_back(i, j, k);           e[m][j].push_back(0);           e[m][i].push_back(k);           if (i != k) e[m][k].push_back(i);           m++;         }     int n;     scanf( %d , &n);     string second;     int num[8] = {};     for (int ni = 0; ni < n - 1; ni++) {       cin >> second;       int a = char_to_int(second[0]);       int b = char_to_int(second[1]);       int c = char_to_int(second[2]);       tuple<int, int, int> t = good_tp(a, b, c);       num[ni] = get_pos(v, t);     }     cin >> second;     int a = char_to_int(second[0]);     int b = char_to_int(second[1]);     int c = char_to_int(second[2]);     tuple<int, int, int> next_tp = good_tp(a, b, c);     printf( %.9f n , (double)ask(pair<long long, tuple<int, int, int> >(                          to_num(num), next_tp)));   }   