洛谷 P2007魔方
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P2007魔方相关的知识,希望对你有一定的参考价值。
P2007 魔方
题目背景
常神牛从来没接触过魔方,所以他要借助计算机来玩。即使是这样,他还是很菜。
题目描述
常神牛家的魔方都是3*3*3的三阶魔方,大家都见过。
(更正:3 4以图为准。)
作为一名菜鸟,常神牛从网上搜了一篇攻略,并找人翻译成了他自己会做的方法。现在告诉你他的魔方情况,以及他从网上搜到的攻略,请你求出最后魔方变成什么样子。
输入输出格式
输入格式:
输入文件为cube.out。
第一行,一串数字(长度不大于100),表示常神牛从网上搜到的攻略。
下面6*3行,每行3个数字,每三行表示魔方一个面的情况,六个面的顺序是前、后、左、右、上、下。
输出格式:
输出文件为cube.out。
6*3行,表示处理后的魔方,形式同输入。
输入输出样例
输入样例#1:
23 121 221 111 123 321 111 123 321 132 132 231 132 121 112 233 332 111 333
输出样例#1:
123 222 113 212 321 113 122 321 132 121 333 121 211 312 113 331 111 331
说明
【样例解释】
麻烦一点的模拟,但是看着样例的图还是比较好做的。
看题目中的四种操作,1,2和3,4只是方向不同,那我们就可以只考虑1,3这两种情况,至于2和4,可以分别调用3次1,3,因为4次是一圈,3次顺时针也就是1次逆时针。
喜闻乐见的Code
#include<cstdio> #include<cstring> using namespace std; struct Cube { static const int z=4,maxop=105; char op[maxop],tmp[z],T[z][z]; char front[z][z],behind[z][z]; char left[z][z],right[z][z]; char up[z][z],down[z][z]; void Build_Cube() { scanf("%s",op); for(int o=1;o<=6;o++) for(int i=1;i<z;i++) { if(o==1) scanf("%s",front[i]+1); else if(o==2) scanf("%s",behind[i]+1); else if(o==3) scanf("%s",left[i]+1); else if(o==4) scanf("%s",right[i]+1); else if(o==5) scanf("%s",up[i]+1); else scanf("%s",down[i]+1); } } void Op(char c) { if(c==‘1‘) { for(int i=1;i<z;i++) tmp[i]=front[i][3]; for(int i=1;i<z;i++) front[i][3]=down[i][3]; for(int i=1;i<z;i++) down[i][3]=behind[i][3]; for(int i=1;i<z;i++) behind[i][3]=up[i][3]; for(int i=1;i<z;i++) up[i][3]=tmp[i]; for(int i=1;i<z;i++) for(int j=1;j<z;j++) T[i][j]=right[i][j]; for(int i=1;i<z;i++) for(int j=1;j<z;j++) right[i][j]=T[z-j][i]; } else if(c==‘2‘) for(int i=1;i<z;i++) Op(‘1‘); else if(c==‘3‘) { for(int i=1;i<z;i++) tmp[i]=front[1][i]; for(int i=1;i<z;i++) front[1][i]=left[1][i]; for(int i=1;i<z;i++) left[1][i]=behind[1][i]; for(int i=1;i<z;i++) behind[1][i]=right[1][i]; for(int i=1;i<z;i++) right[1][i]=tmp[i]; for(int i=1;i<z;i++) for(int j=1;j<z;j++) T[i][j]=up[i][j]; for(int i=1;i<z;i++) for(int j=1;j<z;j++) up[i][j]=T[z-j][i]; } else for(int i=1;i<z;i++) Op(‘3‘); return; } void Print() { for(int o=1;o<=6;o++) for(int i=1;i<z;i++) { if(o==1) printf("%s",front[i]+1); else if(o==2) printf("%s",behind[i]+1); else if(o==3) printf("%s",left[i]+1); else if(o==4) printf("%s",right[i]+1); else if(o==5) printf("%s",up[i]+1); else printf("%s",down[i]+1); puts(""); } } void Play_Cube() { Build_Cube(); for(int i=0;i<strlen(op);i++) Op(op[i]); Print(); } }cube; int main() { cube.Play_Cube(); return 0; }
以上是关于洛谷 P2007魔方的主要内容,如果未能解决你的问题,请参考以下文章