CoderInOutUse's blog

By CoderInOutUse, history, 8 years ago, In English

Здравствуйте, решил порешать задачи из тренировок. Но не могу до конца понять смысл задачи: задача C: Кубики.

Я делаю все просто: У меня есть две строки A и B. При каждой новом кубике, я преобразую строку кубика для того чтобы A[i] был спереди, и если M[i] доступна сверху, снизу и сбоку я умножаю вероятность на 1, если она доступна или сбоку, или сверху, или снизу, то умножаю на 0.5.

Мой код:

#include <bits/stdc++.h>
#define MAXN 100005
#define INF 2e18
#define _INF -20000000

typedef long long ll;
using namespace std;

const ll mod = 1e9 + 9ll;
double ans = 1.0;

string s1, s2, t, no = "-";

int check(string s, char c) {
    int res = 0;
    if(s[0] == c || s[1] == c || s[3] == c || s[5] == c) res += 1;
    if(s[0] == c || s[2] == c || s[4] == c || s[5] == c) res += 1;
    return res;
}

string str(string s, char c) {

    if(s[0] == c) {
        return s;
    }
    else if(s[1] == c) {
        string t = s;
        t[0] = s[1];
        t[1] = s[5];
        t[2] = s[2];
        t[3] = s[0];
        t[4] = s[4];
        t[5] = s[3];
        return t;
    }
    else if(s[2] == c) {
        string t = s;
        t[0] = s[2];
        t[1] = s[1];
        t[2] = s[5];
        t[3] = s[3];
        t[4] = s[0];
        t[5] = s[4];
        return t;
    }
    else if(s[3] == c) {
        string t = s;
        t[0] = s[3];
        t[1] = s[0];
        t[2] = s[2];
        t[3] = s[5];
        t[4] = s[4];
        t[5] = s[1];
        return t;
    }
    else if(s[4] == c) {
        string t = s;
        t[0] = s[4];
        t[1] = s[1];
        t[2] = s[0];
        t[3] = s[3];
        t[4] = s[5];
        t[5] = s[2];
        return t;
    }
    else if(s[5] == c) {
        assert(!1);
        string t = s;
        t[0] = s[5];
        t[1] = s[1];
        t[2] = s[4];
        t[3] = s[3];
        t[4] = s[2];
        t[5] = s[0];
        return t;
    }
    else return no;
}
int main() {
    cin >> s1 >> s2;
    for(int i = 0; i < s1.length(); ++i) {
        cin >> t;
        t = str(t, s1[i]);
        assert(t != no);
        if(t == no) {
            ans = 0.0;
            continue;
        }
        if(s1[i] != s2[i]) {
            int c = check(t, s2[i]);
            if(c == 1) ans /= 2.0;
            else if(c == 0) ans = 0.0;
        }
    }
    cout << fixed << setprecision(6) << ans << endl;
}

Что не так в моем решении? Буду благодарен за помощь.

Full text and comments »

  • Vote: I like it
  • -15
  • Vote: I do not like it