253:Cube painting

253:Cube painting

开始的想法:骰子无论怎么转,每个数字和其对面的数字的对应关系永远不会改变,所以只需要比较两个骰子的三对数字是否相同即可,也的确AC了,但是后来想想不太对。

#include<cstdio>
#include<cstring>
using namespace std;
char s[12];
int vis[3];
int main(){
    while(scanf("%s",s) != EOF){
        int i,j;
        memset(vis,0,sizeof(vis));
        for(i = 0;i < 3;i++){
            for(j = 6;j < 9;j++){
                if(!vis[j-6] && ((s[i] == s[j] && s[5-i] == s[11-j+6])
                   || (s[i] == s[11-j+6] && s[5-i] == s[j]))){
                    vis[j-6] = 1;
                    break;
                }
            }
            if(j == 9){
                printf("FALSE\n");
                break;
            }
        }
        if(i == 3) printf("TRUE\n");
    }
    return 0;
}

比如上图这种情况,虽然三组数字都对应相同,但是两个骰子明显是不一样的,所以只考虑三组数字是无法保证正确的,题目的测试数据不行啊。。。

新的想法:对于第二个骰子,首先确定其与第一个骰子第一个面所对应的面,即确定旋转轴;然后尝试四种可能的旋转情况(逆时针顺序比较四个相邻字母),依次比较两个骰子与第一个面相邻的四个面的字母是否对应相等,如果全部对应那么两枚骰子就是相同的。代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
int cons[6][4] = {{5,4,2,3},{1,4,6,3},{1,2,6,5},{1,5,6,2},{1,3,6,4},{5,3,2,4}};
char s[12];
int main(){
    while(scanf("%s",s) != EOF){
        int i,j,k;
        for(i = 6;i < 12;i++){
            if(s[i] == s[0] && s[6+11-i] == s[5]){
                for(j = 0;j < 4;j++){
                    int t = i - 6,cnt = 0,tc = j;
                    for(k = 0;k < 4;k++){
                        if(s[cons[0][k] - 1] == s[6 + cons[t][(tc++)%4] - 1]) cnt++;
                    }
                    if(cnt == 4) break;
                }
                if(j < 4) break;
            }
        }
        printf("%s\n",i < 12 ? "TRUE" : "FALSE");
    }
    return 0;
}


posted @ 2018-04-12 12:43  ACLJW  阅读(140)  评论(0编辑  收藏  举报