Здравствуйте, решил порешать задачи из тренировок. Но не могу до конца понять смысл задачи:↵
[задача C: Кубики](http://codeforces.net/gym/100942). ↵
↵
Я делаю все просто: У меня есть две строки 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;↵
}↵
~~~~~↵
↵
Что не так в моем решении?↵
Буду благодарен за помощь.↵
↵
[задача C: Кубики](http://codeforces.net/gym/100942). ↵
↵
Я делаю все просто: У меня есть две строки 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;↵
}↵
~~~~~↵
↵
Что не так в моем решении?↵
Буду благодарен за помощь.↵
↵