http://acm.fzu.edu.cn/problem.php?pid=1976
题意:给你一个魔方,现在要你旋转,有顺时针,逆时针,要问你操作几次之后各个面的各个小块的号码;
考点:复杂的模拟题
解题思路:
(1)定义数据结构:
对应每相邻的两个小块当做一个整体来看待;对应的数据结构如下:
struct nnext { int left ,mid;//本小块左边的对应的面号码,本小块的对应的面号码 int ne_id,ne_nebno;//相邻面的号码,本小块对应相邻面的号码 };
其中的left表示这个小块的左边的那个数所对应的面号码;
其中的mid表示这个小块另一个所对应的面号码;
ne_id表示这个小块所相邻的面号码;
ne_nebno表示这个小块所相邻的相邻边的块号码;
每个面所用的数据结构如下:
struct face { nnext ne[6]; }face[12]
每一个面可以有五个小块组成,中间的那一块怎么旋转都不会变,因此不要去管它;
举个例子:
对于第一个面face[0]表示,其中第一个面中的0,1用nnext[0]表示,其中left=0,mid=0(所对应的面),ne_id=4(相邻面),ne_nebno=4(相邻面所对应的块号)其他的类似;
2.对应的其中的操作有如下处理方法:(下面对应顺时针的方法)
对于要操作的面,先去处理当前的面各个块号码
4->3->2->1->0->4(这个意思将第1块给第0块,依次类推),所以先将第0块保存下来,最后将第0块交给第4块就可以了
对于与其相邻边的处理方法都是类似;
#include <iostream> #include <string.h> using namespace std; struct nnext { int left ,mid;//本小块左边的对应的面号码,本小块的对应的面号码 int ne_id,ne_nebno;//相邻面的号码,本小块对应相邻面的号码 }; struct face { nnext ne[6]; }face[12]; void inition()//初始化 { for(int i=0;i<12;i++) { for(int j=0;j<5;j++) { face[i].ne[j].left=i; face[i].ne[j].mid=i; } } face[0].ne[0].ne_id=4;face[0].ne[0].ne_nebno=3; face[0].ne[1].ne_id=5;face[0].ne[1].ne_nebno=4; face[0].ne[2].ne_id=1;face[0].ne[2].ne_nebno=0; face[0].ne[3].ne_id=2;face[0].ne[3].ne_nebno=1; face[0].ne[4].ne_id=3;face[0].ne[4].ne_nebno=2; face[1].ne[0].ne_id=0;face[1].ne[0].ne_nebno=2; face[1].ne[1].ne_id=5;face[1].ne[1].ne_nebno=3; face[1].ne[2].ne_id=10;face[1].ne[2].ne_nebno=3; face[1].ne[3].ne_id=6;face[1].ne[3].ne_nebno=3; face[1].ne[4].ne_id=2;face[1].ne[4].ne_nebno=2; face[2].ne[0].ne_id=3;face[2].ne[0].ne_nebno=3; face[2].ne[1].ne_id=0;face[2].ne[1].ne_nebno=3; face[2].ne[2].ne_id=1;face[2].ne[2].ne_nebno=4; face[2].ne[3].ne_id=6;face[2].ne[3].ne_nebno=2; face[2].ne[4].ne_id=7;face[2].ne[4].ne_nebno=2; face[3].ne[0].ne_id=8;face[3].ne[0].ne_nebno=1; face[3].ne[1].ne_id=4;face[3].ne[1].ne_nebno=4; face[3].ne[2].ne_id=0;face[3].ne[2].ne_nebno=4; face[3].ne[3].ne_id=2;face[3].ne[3].ne_nebno=0; face[3].ne[4].ne_id=7;face[3].ne[4].ne_nebno=1; face[4].ne[0].ne_id=8;face[4].ne[0].ne_nebno=0; face[4].ne[1].ne_id=9;face[4].ne[1].ne_nebno=0; face[4].ne[2].ne_id=5;face[4].ne[2].ne_nebno=0; face[4].ne[3].ne_id=0;face[4].ne[3].ne_nebno=0; face[4].ne[4].ne_id=3;face[4].ne[4].ne_nebno=1; face[5].ne[0].ne_id=4;face[5].ne[0].ne_nebno=2; face[5].ne[1].ne_id=9;face[5].ne[1].ne_nebno=4; face[5].ne[2].ne_id=10;face[5].ne[2].ne_nebno=4; face[5].ne[3].ne_id=1;face[5].ne[3].ne_nebno=1; face[5].ne[4].ne_id=0;face[5].ne[4].ne_nebno=1; face[6].ne[0].ne_id=11;face[6].ne[0].ne_nebno=3; face[6].ne[1].ne_id=7;face[6].ne[1].ne_nebno=3; face[6].ne[2].ne_id=2;face[6].ne[2].ne_nebno=3; face[6].ne[3].ne_id=1;face[6].ne[3].ne_nebno=3; face[6].ne[4].ne_id=10;face[6].ne[4].ne_nebno=2; face[7].ne[0].ne_id=8;face[7].ne[0].ne_nebno=2; face[7].ne[1].ne_id=3;face[7].ne[1].ne_nebno=4; face[7].ne[2].ne_id=2;face[7].ne[2].ne_nebno=4; face[7].ne[3].ne_id=6;face[7].ne[3].ne_nebno=1; face[7].ne[4].ne_id=11;face[7].ne[4].ne_nebno=2; face[8].ne[0].ne_id=4;face[8].ne[0].ne_nebno=0; face[8].ne[1].ne_id=3;face[8].ne[1].ne_nebno=0; face[8].ne[2].ne_id=7;face[8].ne[2].ne_nebno=0; face[8].ne[3].ne_id=11;face[8].ne[3].ne_nebno=1; face[8].ne[4].ne_id=9;face[8].ne[4].ne_nebno=1; face[9].ne[0].ne_id=4;face[9].ne[0].ne_nebno=1; face[9].ne[1].ne_id=8;face[9].ne[1].ne_nebno=4; face[9].ne[2].ne_id=11;face[9].ne[2].ne_nebno=0; face[9].ne[3].ne_id=10;face[9].ne[3].ne_nebno=0; face[9].ne[4].ne_id=5;face[9].ne[4].ne_nebno=1; face[10].ne[0].ne_id=9;face[10].ne[0].ne_nebno=3; face[10].ne[1].ne_id=11;face[10].ne[1].ne_nebno=4; face[10].ne[2].ne_id=6;face[10].ne[2].ne_nebno=4; face[10].ne[3].ne_id=1;face[10].ne[3].ne_nebno=2; face[10].ne[4].ne_id=5;face[10].ne[4].ne_nebno=2; face[11].ne[0].ne_id=9;face[11].ne[0].ne_nebno=2; face[11].ne[1].ne_id=8;face[11].ne[1].ne_nebno=3; face[11].ne[2].ne_id=7;face[11].ne[2].ne_nebno=4; face[11].ne[3].ne_id=6;face[11].ne[3].ne_nebno=0; face[11].ne[4].ne_id=10;face[11].ne[4].ne_nebno=1; return; } int modadd(int c) { if(c==4) return 0; else return c+1; // return ((c+1)%5+5)%5; } void output() { for(int i=0;i<12;i++) { for(int j=0;j<5;j++) { cout<<face[i].ne[j].left<<" "<<face[i].ne[j].mid<<" "; } cout<<i<<endl; } return; } void turn(int s,int d) { nnext a; int i,b; if(d==-1)//顺时针 { a = face[s].ne[0]; for(i=0; i<=3; i++)//当前面 { face[s].ne[i].left = face[s].ne[i+1].left; face[s].ne[i].mid = face[s].ne[i+1].mid; } face[s].ne[4].left = a.left; face[s].ne[4].mid = a.mid; a = face[face[s].ne[0].ne_id].ne[face[s].ne[0].ne_nebno]; b = face[face[s].ne[0].ne_id].ne[modadd(face[s].ne[0].ne_nebno)].left; for(i=0; i<=3; i++)//跟s面相邻的五个面相应的边 { face[face[s].ne[i].ne_id].ne[face[s].ne[i].ne_nebno].left = face[face[s].ne[i+1].ne_id].ne[face[s].ne[i+1].ne_nebno].left; face[face[s].ne[i].ne_id].ne[face[s].ne[i].ne_nebno].mid = face[face[s].ne[i+1].ne_id].ne[face[s].ne[i+1].ne_nebno].mid; face[face[s].ne[i].ne_id].ne[modadd(face[s].ne[i].ne_nebno)].left = face[face[s].ne[i+1].ne_id].ne[modadd(face[s].ne[i+1].ne_nebno)].left; } face[face[s].ne[4].ne_id].ne[face[s].ne[4].ne_nebno].left = a.left; face[face[s].ne[4].ne_id].ne[face[s].ne[4].ne_nebno].mid = a.mid; face[face[s].ne[4].ne_id].ne[modadd(face[s].ne[4].ne_nebno)].left = b; } else { a=face[s].ne[4]; for( i=4;i>=1;i--)//转当前面 { face[s].ne[i].left=face[s].ne[i-1].left; face[s].ne[i].mid=face[s].ne[i-1].mid; } face[s].ne[0].left=a.left; face[s].ne[0].mid=a.mid; a=face[face[s].ne[4].ne_id].ne[face[s].ne[4].ne_nebno]; b=face[face[s].ne[4].ne_id].ne[modadd(face[s].ne[4].ne_nebno)].left; for( i=4;i>=1;i--)//转五周 { face[face[s].ne[i].ne_id].ne[face[s].ne[i].ne_nebno].left=face[face[s].ne[i-1].ne_id].ne[face[s].ne[i-1].ne_nebno].left; face[face[s].ne[i].ne_id].ne[face[s].ne[i].ne_nebno].mid=face[face[s].ne[i-1].ne_id].ne[face[s].ne[i-1].ne_nebno].mid; face[face[s].ne[i].ne_id].ne[modadd(face[s].ne[i].ne_nebno)].left=face[face[s].ne[i-1].ne_id].ne[modadd(face[s].ne[i-1].ne_nebno)].left; } face[face[s].ne[0].ne_id].ne[face[s].ne[0].ne_nebno].left=a.left; face[face[s].ne[0].ne_id].ne[face[s].ne[0].ne_nebno].mid=a.mid; face[face[s].ne[0].ne_id].ne[modadd(face[s].ne[0].ne_nebno)].left=b; } return; } int main() { // freopen("in.txt","r",stdin); int t,n,s,d,ca=1; cin>>t; while(t--) { inition(); cout<<"Case "<<ca++<<":"<<endl; cin>>n; for(int k=1; k<=n; k++) { cin>>s>>d; turn(s,d); } output(); } return 0; }