ZJNU 1196

大模拟,空想很容易把面和面之间的关系搞混

所以这时候需要自己找一个正方体(实在不行长方体代替)跟着图把每个面正方向标出来

然后模拟6种操作分别会对哪些块进行操作

对于储存数据的想法是,对输入输出进行分块,以c[i][j]表示是第i个面的第j块

具体参照下文输入输出内的

for(i=0;i<3;i++)
    for(j=0;j<18;j++){
        scanf("%s",cd);
        c[j/3][j%3+i*3]=cd[0];
    }

for(i=0;i<3;i++)
    for(j=0;j<18;j++)
        printf("%c%c",c[j/3][j%3+i*3],j<17?' ':'
');
#include<stdio.h>
#include<string.h>
char c[6][9],tmp[1001];
int getid(char c){
    switch(c){
        case 'W':return 0;
        case 'O':return 1;
        case 'R':return 2;
        case 'B':return 3;
        case 'G':return 4;
        case 'Y':return 5;
    }
}
void change(char cc){
    char d1,d2,d3;
    if(cc=='W'){//以O面为缓存面
        d1=c[1][0];
        d2=c[1][3];
        d3=c[1][6];
        c[1][0]=c[4][0];
        c[1][3]=c[4][3];
        c[1][6]=c[4][6];
        c[4][0]=c[3][0];
        c[4][3]=c[3][3];
        c[4][6]=c[3][6];
        c[3][0]=c[2][0];
        c[3][3]=c[2][3];
        c[3][6]=c[2][6];
        c[2][0]=d1;
        c[2][3]=d2;
        c[2][6]=d3;
    }
    else if(cc=='O'){//以W面为缓存面
        d1=c[0][2];
        d2=c[0][5];
        d3=c[0][8];
        c[0][2]=c[2][0];
        c[0][5]=c[2][1];
        c[0][8]=c[2][2];
        c[2][0]=c[5][8];
        c[2][1]=c[5][7];
        c[2][2]=c[5][6];
        c[5][8]=c[4][8];
        c[5][7]=c[4][7];
        c[5][6]=c[4][6];
        c[4][8]=d1;
        c[4][7]=d2;
        c[4][6]=d3;
    }
    else if(cc=='R'){//以O面为缓存面
        d1=c[1][6];
        d2=c[1][7];
        d3=c[1][8];
        c[1][6]=c[0][6];
        c[1][7]=c[0][7];
        c[1][8]=c[0][8];
        c[0][6]=c[3][2];
        c[0][7]=c[3][1];
        c[0][8]=c[3][0];
        c[3][2]=c[5][8];
        c[3][1]=c[5][5];
        c[3][0]=c[5][2];
        c[5][8]=d1;
        c[5][5]=d2;
        c[5][2]=d3;
    }
    else if(cc=='B'){//以G面为缓存面
        d1=c[4][0];
        d2=c[4][1];
        d3=c[4][2];
        c[4][0]=c[5][0];
        c[4][1]=c[5][1];
        c[4][2]=c[5][2];
        c[5][0]=c[2][8];
        c[5][1]=c[2][7];
        c[5][2]=c[2][6];
        c[2][8]=c[0][6];
        c[2][7]=c[0][3];
        c[2][6]=c[0][0];
        c[0][6]=d1;
        c[0][3]=d2;
        c[0][0]=d3;
    }
    else if(cc=='G'){//以B面为缓存面
        d1=c[3][6];
        d2=c[3][7];
        d3=c[3][8];
        c[3][6]=c[0][2];
        c[3][7]=c[0][1];
        c[3][8]=c[0][0];
        c[0][2]=c[1][2];
        c[0][1]=c[1][1];
        c[0][0]=c[1][0];
        c[1][2]=c[5][0];
        c[1][1]=c[5][3];
        c[1][0]=c[5][6];
        c[5][0]=d1;
        c[5][3]=d2;
        c[5][6]=d3;
    }
    else if(cc=='Y'){//以G面为缓存面
        d1=c[4][2];
        d2=c[4][5];
        d3=c[4][8];
        c[4][2]=c[1][2];
        c[4][5]=c[1][5];
        c[4][8]=c[1][8];
        c[1][2]=c[2][2];
        c[1][5]=c[2][5];
        c[1][8]=c[2][8];
        c[2][2]=c[3][2];
        c[2][5]=c[3][5];
        c[2][8]=c[3][8];
        c[3][2]=d1;
        c[3][5]=d2;
        c[3][8]=d3;
    }
    int id=getid(cc);
    d1=c[id][0];
    c[id][0]=c[id][6];
    c[id][6]=c[id][8];
    c[id][8]=c[id][2];
    c[id][2]=d1;
    d1=c[id][1];
    c[id][1]=c[id][3];
    c[id][3]=c[id][7];
    c[id][7]=c[id][5];
    c[id][5]=d1;
}
int main(){
    char cd[2];
    int i,j,len;
    for(i=0;i<3;i++)
        for(j=0;j<18;j++){
            scanf("%s",cd);
            c[j/3][j%3+i*3]=cd[0];
        }
    scanf("%s",tmp);
    len=strlen(tmp);
    for(i=0;i<len;i++)
        change(tmp[i]);
    for(i=0;i<3;i++)
        for(j=0;j<18;j++)
            printf("%c%c",c[j/3][j%3+i*3],j<17?' ':'
');
    
    return 0;
}
原文地址:https://www.cnblogs.com/stelayuri/p/12233416.html