Здравствуйте, решил порешать задачи из тренировок. Но не могу до конца понять смысл задачи: задача C: Кубики.
Я делаю все просто: У меня есть две строки A и B. При каждой новом кубике, я преобразую строку кубика для того чтобы A[i] был спереди, и если M[i] доступна сверху, снизу и сбоку я умножаю вероятность на 1, если она доступна или сбоку, или сверху, или снизу, то умножаю на 0.5.
Мой код: <spoiler summary="#include <bits/stdc++.h>
#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;
}
Что не так в моем решении? Буду благодарен за помощь.