luogu2007 魔方

来源:互联网 发布:171网络虚拟电话号码 编辑:程序博客网 时间:2024/06/10 05:30

【传送门】

https://www.luogu.org/problem/show?pid=2007

【纪念碑】

2016年10月5日晚上,誓不A此题绝不睡觉

2016年10月6日凌晨0:20,AC此题

【题解】

模拟就好啦。。

这个题之所以调了这么长时间,在于一个很烦人的问题

如果你要将魔方的一面顺时针旋转

一开始我是这样做的:

(1,1)->t1  (1,2)->t2  (1,3)->t3

(3,1)->(1,1)  (2,1)->(1,2)  (1,1)->(1,3)     //到这里是没有问题的

(3,3)->(3,1)  (3,2)->(2,1)  (3,1)->(1,1)    //这里就挂了

因为你先(3,3)->(3,1)再(3,1)->(1,1),所以就相当于(3,3)->(1,1),这样就错了

其实你是想把原来的(3,1)->(1,1),所以就要换一下顺序,本来第一行是从左到右,现在第一行应该从右到左,第一列从上到下,第三行从左到右,第三列从上到下

【代码】

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;char order[150];int mat[10][10][10], t1, t2, t3;void show(int k){int i, j;for(i=1;i<=3;i++){for(j=1;j<=3;j++)printf("%d",mat[k][i][j]);printf("\n");}}void fu(int &a1, int &a2, int &a3, int &b1, int &b2, int &b3){a1=b1;a2=b2;a3=b3;}void solve(int o){if(o==1){fu(t1,t2,t3,mat[1][3][3],mat[1][2][3],mat[1][1][3]);fu(mat[1][3][3],mat[1][2][3],mat[1][1][3],mat[6][3][3],mat[6][2][3],mat[6][1][3]);fu(mat[6][3][3],mat[6][2][3],mat[6][1][3],mat[2][3][3],mat[2][2][3],mat[2][1][3]);fu(mat[2][3][3],mat[2][2][3],mat[2][1][3],mat[5][3][3],mat[5][2][3],mat[5][1][3]);fu(mat[5][3][3],mat[5][2][3],mat[5][1][3],t1,t2,t3);fu(t1,t2,t3,mat[4][1][3],mat[4][1][2],mat[4][1][1]);//顺时针fu(mat[4][1][3],mat[4][1][2],mat[4][1][1],mat[4][1][1],mat[4][2][1],mat[4][3][1]);fu(mat[4][1][1],mat[4][2][1],mat[4][3][1],mat[4][3][1],mat[4][3][2],mat[4][3][3]);fu(mat[4][3][1],mat[4][3][2],mat[4][3][3],mat[4][3][3],mat[4][2][3],mat[4][1][3]);fu(mat[4][3][3],mat[4][2][3],mat[4][1][3],t1,t2,t3);}if(o==2){fu(t1,t2,t3,mat[1][3][3],mat[1][2][3],mat[1][1][3]);fu(mat[1][3][3],mat[1][2][3],mat[1][1][3],mat[5][3][3],mat[5][2][3],mat[5][1][3]);fu(mat[5][3][3],mat[5][2][3],mat[5][1][3],mat[2][3][3],mat[2][2][3],mat[2][1][3]);fu(mat[2][3][3],mat[2][2][3],mat[2][1][3],mat[6][3][3],mat[6][2][3],mat[6][1][3]);fu(mat[6][3][3],mat[6][2][3],mat[6][1][3],t1,t2,t3);fu(t1,t2,t3,mat[4][1][1],mat[4][1][2],mat[4][1][3]);fu(mat[4][1][1],mat[4][1][2],mat[4][1][3],mat[4][1][3],mat[4][2][3],mat[4][3][3]);fu(mat[4][1][3],mat[4][2][3],mat[4][3][3],mat[4][3][3],mat[4][3][2],mat[4][3][1]);fu(mat[4][3][3],mat[4][3][2],mat[4][3][1],mat[4][3][1],mat[4][2][1],mat[4][1][1]);fu(mat[4][3][1],mat[4][2][1],mat[4][1][1],t1,t2,t3);}if(o==3){fu(t1,t2,t3,mat[1][1][1],mat[1][1][2],mat[1][1][3]);fu(mat[1][1][1],mat[1][1][2],mat[1][1][3],mat[3][1][1],mat[3][1][2],mat[3][1][3]);fu(mat[3][1][1],mat[3][1][2],mat[3][1][3],mat[2][1][1],mat[2][1][2],mat[2][1][3]);fu(mat[2][1][1],mat[2][1][2],mat[2][1][3],mat[4][1][1],mat[4][1][2],mat[4][1][3]);fu(mat[4][1][1],mat[4][1][2],mat[4][1][3],t1,t2,t3);fu(t1,t2,t3,mat[5][1][3],mat[5][1][2],mat[5][1][1]);fu(mat[5][1][3],mat[5][1][2],mat[5][1][1],mat[5][1][1],mat[5][2][1],mat[5][3][1]);fu(mat[5][1][1],mat[5][2][1],mat[5][3][1],mat[5][3][1],mat[5][3][2],mat[5][3][3]);fu(mat[5][3][1],mat[5][3][2],mat[5][3][3],mat[5][3][3],mat[5][2][3],mat[5][1][3]);fu(mat[5][3][3],mat[5][2][3],mat[5][1][3],t1,t2,t3);}if(o==4){fu(t1,t2,t3,mat[1][1][1],mat[1][1][2],mat[1][1][3]);fu(mat[1][1][1],mat[1][1][2],mat[1][1][3],mat[4][1][1],mat[4][1][2],mat[4][1][3]);fu(mat[4][1][1],mat[4][1][2],mat[4][1][3],mat[2][1][1],mat[2][1][2],mat[2][1][3]);fu(mat[2][1][1],mat[2][1][2],mat[2][1][3],mat[3][1][1],mat[3][1][2],mat[3][1][3]);fu(mat[3][1][1],mat[3][1][2],mat[3][1][3],t1,t2,t3);fu(t1,t2,t3,mat[5][1][1],mat[5][1][2],mat[5][1][3]);fu(mat[5][1][1],mat[5][1][2],mat[5][1][3],mat[5][1][3],mat[5][2][3],mat[5][3][3]);fu(mat[5][1][3],mat[5][2][3],mat[5][3][3],mat[5][3][3],mat[5][3][2],mat[5][3][1]);fu(mat[5][3][3],mat[5][3][2],mat[5][3][1],mat[5][3][1],mat[5][2][1],mat[5][1][1]);fu(mat[5][3][1],mat[5][2][1],mat[5][1][1],t1,t2,t3);}}int main(){int i, j, k;char s[10];scanf("%s",order+1);for(k=1;k<=6;k++){for(i=1;i<=3;i++){scanf("%s",s+1);for(j=1;j<=3;j++)mat[k][i][j]=s[j]-48;}}for(i=1;order[i];i++)solve((int)order[i]-48);for(k=1;k<=6;k++)show(k);return 0;}



0 0
原创粉丝点击