Codeforces Round #444 (Div. 2) C. Solution for Cube 枚举、模拟、魔方

ProLightsfx 2018-1-14 144 1/14
C. Solution for Cube 枚举、模拟、魔方

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

 

- THE END -

ProLightsfx

11月17日01:15

最后修改:2024年11月17日
0

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论