算法竞赛入门经典(第2版)习题4-4 骰子涂色 Cube painting UVa 253

来源:互联网 发布:mac能玩什么游戏 编辑:程序博客网 时间:2024/05/17 04:08

这题用穷举法最合适,每种骰子至多有24种状态,读入数据穷举一下就行了。

1.为了提高效率,可以分别用特征数字100(b)/10(g)/1(r)来表示每个面的颜色,这样两个等价骰子的特征数字之和必然是相等的。如果不相等则直接输出'FALSE'

2.骰子可以沿着x/y/z三个方向旋转,如果两个特征数字相等的骰子对不上,那就旋转吧。

一次ac。

//#define LOCAL//#define TESTING#include<stdio.h>#include<ctype.h>#include<string.h>char cube1[7],cube2[7],tempcube[7];int sum1,sum2;int code(char color){    if(color == 'r') return 1;    else if(color == 'g') return 10;    else if(color == 'b') return 100;}int check(){    for(int i = 1; i <= 6; i++)    {        if(tempcube[i]!=cube2[i]) return i;    }    return 0;}void rotatex(){    char temps;    temps = tempcube[1];    tempcube[1] = tempcube[2];    tempcube[2] = tempcube[6];    tempcube[6] = tempcube[5];    tempcube[5] = temps;}void rotatey(){    char temps;    temps = tempcube[2];    tempcube[2] = tempcube[3];    tempcube[3] = tempcube[5];    tempcube[5] = tempcube[4];    tempcube[4] = temps;}void rotatez(){    char temps;    temps = tempcube[1];    tempcube[1] = tempcube[3];    tempcube[3] = tempcube[6];    tempcube[6] = tempcube[4];    tempcube[4] = temps;}int main(){    #ifdef LOCAL    freopen("xt4-4.in","r",stdin);    freopen("xt4-4.out","w",stdout);    #endif    char temp;    while((temp = getchar())!=EOF)    {        memset(cube1,0,sizeof(cube1));        memset(cube2,0,sizeof(cube2));        sum1 = 0;        sum2 = 0;        while(!isalpha(temp)&&temp!=EOF) temp=getchar();        if(temp == EOF) break;        cube1[1] = temp;        sum1 += code(cube1[1]);        for(int i = 2; i <= 6; i++)        {            cube1[i] = getchar();            sum1 += code(cube1[i]);        }        for(int i = 1; i <= 6; i++)        {            cube2[i] = getchar();            sum2 += code(cube2[i]);        }        #ifdef TESTING        for(int i = 1; i <= 6; i++) printf("%c",cube1[i]);        printf("\nsum1 = %d\n",sum1);        for(int i = 1; i <= 6; i++) printf("%c",cube2[i]);        printf("\nsum2 = %d\n",sum2);        #endif        if(sum1 != sum2)        {            printf("FALSE\n");            continue;        }        for(int i = 1; i <= 6; i++) tempcube[i] = cube1[i];        int result = check();        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else rotatey();        rotatex();        result = check();        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else rotatey();        rotatex();        result = check();        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else rotatey();        rotatex();        result = check();        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else rotatey();        rotatez();        result = check();        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else rotatey();        rotatez();        rotatez();        result = check();        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {rotatey();result = check();}        if(!result) {printf("TRUE\n");continue;}        else {printf("FALSE\n");continue;}    }    return 0;}

0 0
原创粉丝点击