【传送门】
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;
}