ZOJ 3736——Pocket Cube

来源:互联网 发布:淘宝商品搜索不到 编辑:程序博客网 时间:2024/05/01 06:05

转载请注明出处:http://blog.csdn.net/u010734277


题目意思是有一个二阶的模仿,给出初始形态,问在N次旋转之内最多可以有多少个面是拧好的(拧好就是这个面每个小格子的颜色一样)。

我用了一个三维数组来表示一个魔方,第一位是面,面按照前,左,后,右,顶,底的顺序。第二位跟第三位是这个面的坐标,将这个面放到前面以后,按照从左往右,从上到下进行编号。

魔方总共六个面,每个面按照顺时针和逆时针两种旋转方法,总共就是12种旋转方法。但是注意前面顺时针跟后面逆时针实际是一样的。所以就将情况简化为6种。

twist函数表示了魔方旋转过程对数组的修改。第一个参数k代表是在哪一面旋转,0代表正面,1代表顶面,2代表右面。第二个参数side代表旋转方向,0顺时针,1逆时针。这个函数是最卡人的,修改了好几次才成功。

在进行测试的时候使用了这组数据:

7
1 2 3 4 5 6 7 8 9 0 11 12 13 14 15 16 17 18 19 20 21 22 23 24

虽然题目说每个格子上的颜色不会大于5,但是这是测试,只要能找到问题就行。在测试这组数据的时候发现输出竟然是1。由于这组数据上每个面的数字都不相同,所以最后答案必定是0。然后就开始找函数里面那个地方的坐标写错了。找了好长时间终于找到了。

跟别人大牛比起来我的代码简直不忍直视……他们的代码就四五十行,我的100多。主要还是在旋转方式的处理上他们的方法貌似能更准确。

代码如下:

#include<iostream>#include<cstring>using namespace std;int Puzzle[6][2][2];void twist(int k,int side){if(k==0&&side==0){int tmp0=Puzzle[0][0][0];int tmp1=Puzzle[0][0][1];int tmp2=Puzzle[0][1][0];int tmp3=Puzzle[0][1][1];Puzzle[0][0][0]=tmp2;Puzzle[0][0][1]=tmp0;Puzzle[0][1][0]=tmp3;Puzzle[0][1][1]=tmp1;tmp2=Puzzle[4][1][0];tmp3=Puzzle[4][1][1];Puzzle[4][1][0]=Puzzle[1][1][1];Puzzle[4][1][1]=Puzzle[1][0][1];Puzzle[1][1][1]=Puzzle[5][0][1];Puzzle[1][0][1]=Puzzle[5][0][0];Puzzle[5][0][0]=Puzzle[3][1][0];Puzzle[5][0][1]=Puzzle[3][0][0];Puzzle[3][1][0]=tmp3;Puzzle[3][0][0]=tmp2;}else if(k==0&&side==1){int tmp0=Puzzle[0][0][0];int tmp1=Puzzle[0][0][1];int tmp2=Puzzle[0][1][0];int tmp3=Puzzle[0][1][1];Puzzle[0][0][0]=tmp1;Puzzle[0][0][1]=tmp3;Puzzle[0][1][0]=tmp0;Puzzle[0][1][1]=tmp2;tmp2=Puzzle[4][1][0];tmp3=Puzzle[4][1][1];Puzzle[4][1][0]=Puzzle[3][0][0];Puzzle[4][1][1]=Puzzle[3][1][0];Puzzle[3][0][0]=Puzzle[5][0][1];Puzzle[3][1][0]=Puzzle[5][0][0];Puzzle[5][0][1]=Puzzle[1][1][1];Puzzle[5][0][0]=Puzzle[1][0][1];Puzzle[1][1][1]=tmp2;Puzzle[1][0][1]=tmp3;//fixed}else if(k==1&&side==0){//changedint tmp0=Puzzle[4][0][0];int tmp1=Puzzle[4][0][1];int tmp2=Puzzle[4][1][0];int tmp3=Puzzle[4][1][1];Puzzle[4][0][0]=tmp2;Puzzle[4][0][1]=tmp0;Puzzle[4][1][0]=tmp3;Puzzle[4][1][1]=tmp1;tmp1=Puzzle[2][0][1];tmp0=Puzzle[2][0][0];Puzzle[2][0][0]=Puzzle[1][0][0];Puzzle[2][0][1]=Puzzle[1][0][1];Puzzle[1][0][1]=Puzzle[0][0][1];Puzzle[1][0][0]=Puzzle[0][0][0];Puzzle[0][0][0]=Puzzle[3][0][0];Puzzle[0][0][1]=Puzzle[3][0][1];Puzzle[3][0][1]=tmp1;Puzzle[3][0][0]=tmp0;}else if(k==1&&side==1){//changedint tmp0=Puzzle[4][0][0];int tmp1=Puzzle[4][0][1];int tmp2=Puzzle[4][1][0];int tmp3=Puzzle[4][1][1];Puzzle[4][0][0]=tmp1;Puzzle[4][0][1]=tmp3;Puzzle[4][1][0]=tmp0;Puzzle[4][1][1]=tmp2;tmp1=Puzzle[2][0][1];tmp0=Puzzle[2][0][0];Puzzle[2][0][1]=Puzzle[3][0][1];Puzzle[2][0][0]=Puzzle[3][0][0];Puzzle[3][0][1]=Puzzle[0][0][1];Puzzle[3][0][0]=Puzzle[0][0][0];Puzzle[0][0][1]=Puzzle[1][0][1];Puzzle[0][0][0]=Puzzle[1][0][0];//fixedPuzzle[1][0][1]=tmp1;Puzzle[1][0][0]=tmp0;}else if(k==2&&side==0){//changed int tmp0=Puzzle[3][0][0];int tmp1=Puzzle[3][0][1];int tmp2=Puzzle[3][1][0];int tmp3=Puzzle[3][1][1];Puzzle[3][0][0]=tmp2;Puzzle[3][0][1]=tmp0;Puzzle[3][1][0]=tmp3;Puzzle[3][1][1]=tmp1;tmp1=Puzzle[4][0][1];tmp3=Puzzle[4][1][1];Puzzle[4][0][1]=Puzzle[0][0][1];Puzzle[4][1][1]=Puzzle[0][1][1];Puzzle[0][1][1]=Puzzle[5][1][1];Puzzle[0][0][1]=Puzzle[5][0][1];Puzzle[5][0][1]=Puzzle[2][1][0];Puzzle[5][1][1]=Puzzle[2][0][0];Puzzle[2][1][0]=tmp1;Puzzle[2][0][0]=tmp3;}else if(k==2&&side==1){//changedint tmp0=Puzzle[3][0][0];int tmp1=Puzzle[3][0][1];int tmp2=Puzzle[3][1][0];int tmp3=Puzzle[3][1][1];Puzzle[3][0][0]=tmp1;Puzzle[3][0][1]=tmp3;Puzzle[3][1][0]=tmp0;Puzzle[3][1][1]=tmp2;tmp1=Puzzle[4][0][1];tmp3=Puzzle[4][1][1];Puzzle[4][0][1]=Puzzle[2][1][0];Puzzle[4][1][1]=Puzzle[2][0][0];Puzzle[2][0][0]=Puzzle[5][1][1];Puzzle[2][1][0]=Puzzle[5][0][1];Puzzle[5][0][1]=Puzzle[0][0][1];Puzzle[5][1][1]=Puzzle[0][1][1];Puzzle[0][1][1]=tmp3;Puzzle[0][0][1]=tmp1;}else{cout<<"wrong"<<endl;}}int  check(){int num=0;for(int i=0;i<6;++i){if(Puzzle[i][0][0]==Puzzle[i][0][1]&&Puzzle[i][0][1]==Puzzle[i][1][1]&&Puzzle[i][1][1]==Puzzle[i][1][0])num++;}return num;}int dfs(int n){if(n==0){//if(check())cout<<"xxxn="<<n<<endl;//tstreturn check();}int t=check();//if(t)cout<<"n="<<n<<endl;//tstn--;for(int k=0;k<3;++k){for(int side=0;side<2;++side){int back_up[6][2][2];memcpy(back_up,Puzzle,sizeof(Puzzle));twist(k,side);int tmp=dfs(n);if(tmp>t)t=tmp;memcpy(Puzzle,back_up,sizeof(Puzzle));}}//if(t)cout<<"~~~n="<<n<<endl;//tstreturn t;}int main(){//freopen("data.txt","r",stdin);ios::sync_with_stdio(false);int n;while(cin>>n){cin>>Puzzle[2][0][1]>>Puzzle[2][0][0]>>Puzzle[2][1][1]>>Puzzle[2][1][0];cin>>Puzzle[1][0][0]>>Puzzle[1][1][0]>>Puzzle[5][1][0]>>Puzzle[5][1][1]>>Puzzle[3][1][1]>>Puzzle[3][0][1];cin>>Puzzle[1][0][1]>>Puzzle[1][1][1]>>Puzzle[5][0][0]>>Puzzle[5][0][1]>>Puzzle[3][1][0]>>Puzzle[3][0][0];cin>>Puzzle[0][1][0]>>Puzzle[0][1][1]>>Puzzle[0][0][0]>>Puzzle[0][0][1];cin>>Puzzle[4][1][0]>>Puzzle[4][1][1]>>Puzzle[4][0][0]>>Puzzle[4][0][1];cout<<dfs(n)<<endl;}return 0;}



0 0