My Solution
题意:给出一个2*2*2的魔方的一个状态,问能不能转一下使得魔方满足每个面只有同一种颜色(1<= ai <= 6)。
枚举、模拟、魔方
根据题意只有2个面已经是同一种颜色,另外4个面每个面2种颜色,才可能可行可能可行。
每个面按以下方式编号,
1
4 2 5 6
3
则根据相同的面是1与3或者2与6或者4与5进行讨论。
然后对于每种情况讨论转的方向(顺时针或者逆时针),耐心的慢慢写,慢慢模拟就行。
详情请见代码。
#include
#include
#include
using namespace std;
typedef long long LL;
const int MAXN = 1e6 + 8;
int v[8][2][2];
bool f[8];
int main()
{
#ifdef LOCAL
freopen("c.txt", "r", stdin);
//freopen("c.out", "w", stdout);
int T = 4;
while(T--){
#endif // LOCAL
ios::sync_with_stdio(false); cin.tie(0);
bool ans = false;
int i, j, k, cnt, lf = -1, rf = -1;
for(i = 1; i <= 6; i++){
cnt = 0;
for(j = 0; j < 2; j++){
for(k = 0; k < 2; k++){ cin >> v[i][j][k];
if(v[i][j][k] == v[i][0][0]){
cnt++;
}
}
}
if(cnt == 4){
f[i] = true;
}
}
cnt = 0;
for(i = 1; i <= 6; i++){
if(f[i]){
cnt++;
if(lf == -1){
lf = i;
}
else rf = i;
}
}
if(cnt == 2){
if(lf == 1 && rf == 3){
if(v[2][0][0] == v[2][0][1] && v[2][1][0] == v[2][1][1] && v[5][0][0] == v[5][0][1] && v[5][1][0] == v[5][1][1] &&
v[6][0][0] == v[6][0][1] && v[6][1][0] == v[6][1][1] && v[4][0][0] == v[4][0][1] && v[4][1][0] == v[4][1][1]){
if(v[2][0][0] == v[5][1][0] && v[5][0][0] == v[6][1][0] && v[6][0][0] == v[4][1][0] && v[4][0][0] == v[2][1][0]){
ans = true;
}
if(v[2][0][0] == v[4][1][0] && v[4][0][0] == v[6][1][0] && v[6][0][0] == v[5][1][0] && v[5][0][0] == v[2][1][0]){
ans = true;
}
}
}
else if(lf == 2 && rf == 6){
if(v[1][0][0] == v[1][0][1] && v[1][1][0] == v[1][1][1] && v[3][0][0] == v[3][0][1] && v[3][1][0] == v[3][1][1] &&
v[5][0][0] == v[5][1][0] && v[5][0][1] == v[5][1][1] && v[4][0][0] == v[4][1][0] && v[4][0][1] == v[4][1][1]){
if(v[1][0][0] == v[5][0][0] && v[5][0][1] == v[3][0][0] && v[3][1][0] == v[4][0][1] && v[4][0][0] == v[1][1][0]){
ans = true;
}
if(v[1][0][0] == v[4][0][1] && v[4][0][0] == v[3][0][0] && v[3][1][0] == v[5][0][0] && v[5][0][1] == v[1][1][0]){
ans = true;
}
}
}
else if(lf == 4 && rf == 5){
if(v[1][0][0] == v[1][1][0] && v[1][0][1] == v[1][1][1] && v[3][0][0] == v[3][1][0] && v[3][0][1] == v[3][1][1] &&
v[2][0][0] == v[2][1][0] && v[2][0][1] == v[2][1][1] && v[6][0][0] == v[6][1][0] && v[6][0][1] == v[6][1][1]){
if(v[1][0][0] == v[2][0][1] && v[2][0][0] == v[3][0][1] && v[3][0][0] == v[6][0][0] && v[6][0][1] == v[1][0][1]){
ans = true;
}
if(v[1][0][0] == v[6][0][0] && v[2][0][0] == v[1][0][1] && v[3][0][0] == v[2][0][1] && v[6][0][1] == v[3][0][1]){
ans = true;
}
}
}
}
if(ans) cout << "YES" << endl;
else cout << "NO" << endl;
#ifdef LOCAL
memset(f, false, sizeof f);
cout << endl;
}
#endif // LOCAL
return 0;
}
Thank you!
------from ProLightsfx
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/codeforces-round-444-div-2-c-solution-for-cube/
共有 0 条评论