UVA253 骰子涂色 Cube painting 题解

直接模拟就行了。

我的方法似乎比其他题解麻烦(傻瓜式做法),但逻辑简单,容易理解。

用一个结构体来存骰子的每一个面的相邻面

char a[7], b[7];
struct node{
    char s;
    char b[5];
}an[7], bn[7];
an[1].s = a[1], an[1].b[1] = a[2], an[1].b[2] = a[3], an[1].b[3] = a[4], an[1].b[4] = a[5];
an[2].s = a[2], an[2].b[1] = a[1], an[2].b[2] = a[3], an[2].b[3] = a[4], an[2].b[4] = a[6];
an[3].s = a[3], an[3].b[1] = a[1], an[3].b[2] = a[2], an[3].b[3] = a[5], an[3].b[4] = a[6];
...省略9行(两个数组类似)

然后排序,

先把每个面的相邻面排序,

再把排序。

最后比较两个数组,判断输出就行了。

注意 UVA 的多组数据。

AC 完整代码

#include <bits/stdc++.h>
using namespace std;
char a[7], b[7];
struct node{
    char s;
    char b[5];
}an[7], bn[7];
void mmst() { //初始化是个好习惯
    for(int i = 1; i <= 6; i++) {
        a[i] = ' ', b[i] = ' ';
        for(int j = 1; j <= 4; j++) an[i].b[j] = ' ', bn[i].b[j] = ' ';
    }
}
bool cmp(node x, node y) { //较为保险的比较函数
    if(x.s == y.s) {
        if(x.b[1] == y.b[1]) {
            if(x.b[2] == y.b[2]) {
                if(x.b[3] == y. b[3]) {
                    if(x.b[4] == y.b[4]) {
                        if(x.b[5] == y.b[5]) return x.b[6] < y.b[6];
                        else return x.b[5] < y.b[5];
                    }else return x.b[4] < y.b[4];
                }else return x.b[3] < y.b[3];
            }else return x.b[2] < y.b[2];
        }else return x.b[1] < y.b[1];
    }
    return x.s < y.s;
}
bool check() {
    an[1].s = a[1], an[1].b[1] = a[2], an[1].b[2] = a[3], an[1].b[3] = a[4], an[1].b[4] = a[5];
    an[2].s = a[2], an[2].b[1] = a[1], an[2].b[2] = a[3], an[2].b[3] = a[4], an[2].b[4] = a[6];
    an[3].s = a[3], an[3].b[1] = a[1], an[3].b[2] = a[2], an[3].b[3] = a[5], an[3].b[4] = a[6];
    an[4].s = a[4], an[4].b[1] = a[1], an[4].b[2] = a[2], an[4].b[3] = a[5], an[4].b[4] = a[6];
    an[5].s = a[5], an[5].b[1] = a[1], an[5].b[2] = a[3], an[5].b[3] = a[4], an[5].b[4] = a[6];
    an[6].s = a[6], an[6].b[1] = a[2], an[6].b[2] = a[3], an[6].b[3] = a[4], an[6].b[4] = a[5];

    bn[1].s = b[1], bn[1].b[1] = b[2], bn[1].b[2] = b[3], bn[1].b[3] = b[4], bn[1].b[4] = b[5];
    bn[2].s = b[2], bn[2].b[1] = b[1], bn[2].b[2] = b[3], bn[2].b[3] = b[4], bn[2].b[4] = b[6];
    bn[3].s = b[3], bn[3].b[1] = b[1], bn[3].b[2] = b[2], bn[3].b[3] = b[5], bn[3].b[4] = b[6];
    bn[4].s = b[4], bn[4].b[1] = b[1], bn[4].b[2] = b[2], bn[4].b[3] = b[5], bn[4].b[4] = b[6];
    bn[5].s = b[5], bn[5].b[1] = b[1], bn[5].b[2] = b[3], bn[5].b[3] = b[4], bn[5].b[4] = b[6];
    bn[6].s = b[6], bn[6].b[1] = b[2], bn[6].b[2] = b[3], bn[6].b[3] = b[4], bn[6].b[4] = b[5];
    for(int i = 1; i <= 6; i++) 
        sort(an[i].b + 1, an[i].b + 5), sort(bn[i].b + 1, bn[i].b + 5);
    sort(an + 1, an + 7, cmp);
    sort(bn + 1, bn + 7, cmp);
    for(int i = 1; i <= 6; i++) for(int j = 1; j <= 4; j++)
        if(an[i].b[j] != bn[i].b[j]) return false;
    return true;
}
int main() {
    string str;
    while(cin >> str) {
        mmst();
        for(int i = 0; i <= 5; i++) a[i + 1] = str[i];
        for(int i = 6; i <= 11; i++) b[i - 5] = str[i];
        if(check()) printf("TRUE\n");
        else printf("FALSE\n");
    }
    return 0;
}
上一篇:Kylin系列7-Cube 构建优化


下一篇:mPaaS 月度小报|魔方卡片(Cube)公测,十个卡片模板任意使用