大致题意:

题目描述口袋魔方又称为迷你魔方,通俗的来讲就是二阶魔方,只有八个角块的魔方,如图所示。
二阶魔方8个角块的位置均可进行任意互换(8!种状态),如果以一个角块不动作为参考角块,其他7个
角块都能任意转换方向(即37种状态)。如果在空间中旋转则不计算方向不同而状态相同的魔方,实际上的准确
状态数还应除以24。所以二阶魔方的总状态数为: 7!*3^6=3674160。二阶魔方的最远复原距离(即最需要最多
步骤复原的状态)为11次全旋转,或者14次普通旋转,此结果可以用暴力穷举算法计算出
下面给你一个口袋魔方,只需要进行一些简单的处理就能解决这道题了。对于此魔方的任意一个面,你可以选择
顺时针旋转或者逆时针进行一次90度的旋转,如果能够进行不超过一次的旋转操作,就能使此魔方复原(每面内
部颜色相同,共六种颜色),那么请输出“我真是个小机灵鬼!”,否则请输出“这个魔方有bug!”。输入第一行一个T,代表测试实例数。
每个测试实例有6行输入。
每行4个整数,代表相应位置的颜色
输入数字位置对应下面魔方展开图。
如a代表输入的第一个整数所在位置,其他同上。
+ - + - + - + - + - + - +
| q  | r  | a  | b  | u | v  |
+ - + - + - + - + - + - +
| s  | t  | c  | d  | w  | x  |
+ - + - + - + - + - + - +| e  | f  |+ - + - +| g  | h |+ - + - +| i   | j  |+ - + - +| k  | l  |+ - + - +| m | n |+ - + - +| o  | p |+ - + - +输出如题。
样例输入4
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6
6 6 6 6
1 1 1 1
2 2 2 2
3 3 3 3
5 5 5 5
4 4 4 4
1 4 1 4
2 1 2 1
3 2 3 2
4 3 4 3
5 5 5 5
6 6 6 6
1 3 1 3
2 4 2 4
3 1 3 1
4 2 4 2
5 5 5 5
6 6 6 6样例输出我真是个小机灵鬼!
我真是个小机灵鬼!
我真是个小机灵鬼!
这个魔方有bug!

View Code (已折叠! )

大致思路:

1.枚举全部地旋转方法,共八种: 顺时针 : 横一层/横二层/竖一层/竖二层 / 侧一层/侧二层

同时逆时针,全部都对应一个;共16种!

2. 每次旋转,只转动一层的八个格点而已 ; 八个格点只需要顺序或者逆序排序一下然后赋值即可!

3.每旋转一次, 每个面上相邻的两个不用考虑顺序,因为这两个毕竟顺着方向上的旋转下是绑定在一起的!

4/繁琐的东西用函数实现, 把一个大问题化解成小问题!

5/注意把他们展开后,记得画图!用线顺时针在平面图上用线顺时针连起来! 后面的那个格子上下是颠倒的!串线的时候需要注意三维空间的真实情况!!

题解:

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define inf 0x3f3f3f3f
  4 #define N 50008
  5 #define ll long long
  6 #define mem(a,x) memset(a,x,sizeof(a))  ///问题 C: 签到(sign)
  7 int a[100];  //存每个面的颜色
  8 int mp1[10][10]={
  9     {1,2,3,4},
 10     {5,6,7,8},
 11     {9,10,11,12},
 12     {13,14,15,16},
 13     {17,18,19,20},
 14     {21,22,23,24}
 15 };
 16 int mp2[10][10]={
 17     {17,18,1,2,21,22,11,12},   //y=1&2
 18     {19,20,3,4,23,24,9,10},
 19     {1,3,5,7,9,11,13,15},  //rotate(),x=1&x=2
 20     {2,4,6,8,10,12,14,16},
 21     {18,20,15,16,21,23,5,6},
 22     {17,19,13,14,22,24,7,8}
 23 };
 24
 25 void Rotate(int k,int mode){   //转动第k行mp2[]的列表  ,mode=0顺,mode=1表示逆
 26     vector<int>ans;
 27     for(int i=0;i<8;i++){
 28         int x=mp2[k][i];
 29         ans.push_back(a[x]);
 30     }
 31
 32     if(mode==0){
 33         ans.push_back(ans[0]);
 34         ans.push_back(ans[1]);
 35         ans.erase(ans.begin(),ans.begin()+2);
 36
 37          for(int i=0;i<8;i++){
 38             int x=mp2[k][i];
 39             a[x]=ans[i];
 40         }
 41     }
 42     else{
 43         int x=ans[7],y=ans[6];
 44         ans.insert(ans.begin(),x);
 45         ans.insert(ans.begin(),y);
 46         ans.erase(ans.end()-2,ans.end());
 47          for(int i=0;i<8;i++){
 48             int x=mp2[k][i];
 49             a[x]=ans[i];
 50         }
 51     }
 52 }
 53 bool judge(){
 54     for(int i=0;i<6;i++){
 55         int mx=-10000,minn=inf;
 56         for(int j=0;j<4;j++){
 57             int x=mp1[i][j];
 58             mx=max(mx,a[x]);
 59             minn=min(minn,a[x]);
 60         }
 61         if(mx!=minn)return 0;
 62     }
 63     return 1;
 64 }
 65 //void debug(){
 66 //    printf("%3d %3d %3d %3d %3d %3d\n",a[17],a[18],a[1],a[2],a[21],a[22]);
 67 //    printf("%3d %3d %3d %3d %3d %3d\n",a[19],a[20],a[3],a[4],a[23],a[24]);
 68 //    printf("        %3d %3d\n        %3d %3d\n",a[5],a[6],a[7],a[8]);
 69 //    printf("        %3d %3d\n        %3d %3d\n",a[9],a[10],a[11],a[12]);
 70 //    printf("        %3d %3d\n        %3d %3d\n",a[13],a[14],a[15],a[16]);
 71 //    printf("________\n");
 72 //}
 73 void debug(){
 74     cout<<endl;
 75     for(int i=1;i<=24;i++)
 76         printf("%d%c",a[i],i%4==0?'\n':' ');
 77     cout<<endl;
 78 }
 79 int main(){
 80     int T;
 81     scanf("%d",&T);
 82     while(T--){
 83         a[0]=-1;
 84         for(int i=1;i<=24;i++)
 85             scanf("%d",&a[i]);
 86
 87 //        bool f=0;
 88 //        for(int i=0;!f&&i<6;i++)  //mode=0
 89 //            {
 90 //                Rotate(i,0);
 91 //                if(judge()==1)f=1;debug();
 92 //                Rotate(i,1);
 93 //                Rotate(i,1);
 94 //                if(judge()==1)f=1;debug();
 95 //                Rotate(i,0);
 96 //              //  if(judge()==0)printf("i1=%d,66666666\n",i);
 97 //            }
 98
 99         if(judge()==1){
100             printf("我真是个小机灵鬼!\n");
101         }
102         else{
103             bool f=0;
104             for(int i=0;!f&&i<6;i++)  //mode=0
105             {
106                 Rotate(i,0);
107                 if(judge()==1)f=1;
108                 Rotate(i,1);
109               //  if(judge()==0)printf("i1=%d,66666666\n",i);
110             }
111             for(int i=0;!f&&i<6;i++)   //mode=1
112             {
113                 Rotate(i,1);
114                 if(judge()==1)f=1;
115                 Rotate(i,0);
116              //   if(judge()==0)printf("i1=%d,66666666\n",i);
117             }
118             if(!f)
119                 printf("这个魔方有bug!\n");
120             else
121                 printf("我真是个小机灵鬼!\n");
122         }
123     }
124
125     return 0;
126 }

View Code(简洁思路版!)

当然,我第一次不是这么写的!我是把所有的16种情况,每种情况单写一个函数解决的!

写到第8个时,发现正着和逆着旋转某个角度其实可以化简,就回头看看,加了个op=-1!

题解:(写了六个小时!!)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define N 110
char str[N];///第一维表示魔方的面
int mp[10][20]=
{{1,2,2, 2,2,2, 1,1,2, 2,1,2},  ///总共六个面,下标0-5  face_id{1,1,2, 2,1,2, 1,1,1, 2,1,1},{1,1,1, 2,1,1, 1,2,1, 2,2,1},{1,2,1, 2,2,1, 1,2,2, 2,2,2},{1,2,1, 1,2,2, 1,1,1, 1,1,2},{2,2,2, 2,2,1, 2,1,2, 2,1,1}
};struct node{int x,y,z,Face;node(int x=0,int y=0,int z=0,int Face=0):x(x),y(y),z(z),Face(Face){}
};int a[10][10][10][10];   ///四维对应 x-y-z- face_idbool judge()  ///判断是否达成魔方的要求
{for(int i=0; i<=5; i++) //总共六个面
    {int minn=999,maxx=-1;for(int j=1; j<=4; j++){int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];minn=min(minn, a[x][y][z][i]);maxx=max(maxx, a[x][y][z][i]);}if(minn!=maxx)return false;}return true;
}
void debug(vector<int>st,int mode){cout<<"_______________***"<<"mode="<<mode<<endl;for(int i=0; i<=5; i++) //总共六个面
        {for(int j=1; j<=4; j++){int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];cout<<a[x][y][z][i]<<" ";  ///四维对应 x-y-z- face_id
            }cout<<endl;}cout<<"***"<<"st_list__"<<endl;for(int i=0;i<(int)st.size();i++){if((i+1)%4==0)printf(" %d **\n",st[i]);elseprintf(" %d",st[i]);}cout<<endl;
}
void rotating(int mode){vector<int>st;int op=1;if(mode==0||mode==1){for(int i=0; i<=3; i++) //总共六个面
        {for(int j=1; j<=4; j+=2){int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}}int len=st.size(),cnt=0;if(mode==1)op=-1;for(int i=0; i<=3; i++) //总共4个面,只取两个即可
        {for(int j=1; j<=4; j+=2){int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt-2*op+len)%len] ; ///x=1的四块,shun/ni时针cnt++;}}}else if(mode == 2 || mode==3){for(int i=0; i<=3; i++){ //总共4个面for(int j=2; j<=4; j+=2){int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}}int len=st.size(),cnt=0;if(mode==3)op=-1;for(int i=0; i<=3; i++){ //总共4个面,只取两个即可for(int j=2; j<=4; j+=2){int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt-2*op+len)%len] ;///x=2的四块,shun/ni时针cnt++;}}}else if(mode==4||mode==5){int ii[]={0,5,2,4};for(int k=0; k<=3; k++){ //总共4个面if(ii[k]==2){for(int j=1; j<=2; j++){int i=ii[k];int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}continue;}for(int j=3; j<=4; j++){int i=ii[k];int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}}int len=st.size(),cnt=0;if(mode==5)op=-1;for(int k=0; k<=3; k++){ //总共4个面,只取两个即可if(ii[k]==2){for(int j=1; j<=2; j++){int i=ii[k];int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt+2*op+len)%len] ;cnt++;}continue;}for(int j=3; j<=4; j++){int i=ii[k];int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt+2*op+len)%len] ;///y=1的四块,shun/ni时针cnt++;}}}else if(mode==6||mode==7){        ///y=2,   3,4,1,2int ii[]={0,5,2,4};for(int k=0; k<=3; k++){ //总共4个面if(ii[k]==2){for(int j=3; j<=4; j++){int i=ii[k];int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}continue;}for(int j=1; j<=2; j++){int i=ii[k];int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}}int len=st.size(),cnt=0;if(mode==7)op=-1;for(int k=0; k<=3; k++){ //总共4个面,只取两个即可if(ii[k]==2){for(int j=3; j<=4; j++){int i=ii[k];int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt+2*op+len)%len] ;cnt++;}continue;}for(int j=1; j<=2; j++){int i=ii[k];int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt+2*op+len)%len] ;///y=2的四块,shun/ni时针cnt++;}}}else if(mode==8||mode==9){if(mode==9) op=-1;for(int j=3; j<=4; j++){int i=1;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}for(int j=2; j<=4; j+=2){int i=5;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}for(int j=1; j<=2; j++){int i=3;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}for(int j=1; j<=3; j+=2){int i=4;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}int len=st.size(),cnt=0;for(int j=3; j<=4; j++){int i=1;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt-2*op+len)%len] ;///z=1的四块,shun/逆时针cnt++;}for(int j=2; j<=4; j+=2){int i=5;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt-2*op+len)%len] ;///z=1的四块,shun/逆时针cnt++;}for(int j=1; j<=2; j++){int i=3;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt-2*op+len)%len] ;///z=1的四块,shun/逆时针cnt++;}for(int j=1; j<=3; j+=2){int i=4;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt-2*op+len)%len] ;///z=1的四块,shun/逆时针cnt++;}}else if(mode==10||mode==11){if(mode==11)op=-1;for(int j=1; j<=2; j++){int i=1;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}for(int j=1; j<=3; j+=2){int i=5;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}for(int j=3; j<=4; j++){int i=3;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}for(int j=2; j<=4; j+=2){int i=4;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];st.push_back(a[x][y][z][i]);}int len=st.size(),cnt=0;for(int j=1; j<=2; j++){int i=1;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt-2*op+len)%len] ;///z=2的四块,shun/逆时针cnt++;}for(int j=1; j<=3; j+=2){int i=5;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt-2*op+len)%len] ;///z=2的四块,shun/逆时针cnt++;}for(int j=3; j<=4; j++){int i=3;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt-2*op+len)%len] ;///z=2的四块,shun/逆时针cnt++;}for(int j=2; j<=4; j+=2){int i=4;int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];a[x][y][z][i] = st[(cnt-2*op+len)%len] ;///z=2的四块,shun/逆时针cnt++;}}// debug(st,mode);
}int main()
{int T;scanf("%d",&T);while(T--){for(int i=0; i<=5; i++) //总共六个面
        {for(int j=1; j<=4; j++){int x=mp[i][j*3-3];int y=mp[i][j*3-2];int z=mp[i][j*3-1];cin>>a[x][y][z][i];  ///四维对应 x-y-z- face_id
            }}
//        vector<int>st;
//        debug(st,-1);if(judge()==true){printf("我真是个小机灵鬼!\n");}else{bool ans=false;for(int i=0;i<12&&!ans;i++){rotating(i);ans=judge();rotating(i^1);  //旋转回去
                }if(ans)printf("我真是个小机灵鬼!\n");elseprintf("这个魔方有bug!\n");}}return 0;
}//        for(int i=0;i<=11;i++){
//                int test=i;
//            rotating(test);rotating(test^1);rotating(test^1);rotating(test);
//            ///test成功:0,1,2, 3,4,5,6,7,8,9 ,
//            if(judge()==true)
//            {
//                printf("Test %d OK!\n",test);
//            }
//            else{
//                printf("%d False!\n",test);
//            }
//            continue;
//        }//rotating(0);rotating(0^1); //测试成功//rotating(2);rotating(3); ///测试成功//  rotating(4);rotating(4^1); ///测试成功// rotating(6);rotating(6^1); ///测试成功//   rotating(10);rotating(10^1); ///测试成功 ,对一个正确的解,同一个层面顺拧一次、反拧一次必定正确//  rotating(2^1);//  cout<<"^1= "<<(2^1)<<endl;

View Code

转载于:https://www.cnblogs.com/zhazhaacmer/p/9769015.html

zznu-2183: 口袋魔方相关推荐

  1. 基于文心一言的底层视觉理解,百度网盘把「猫」换成了「黄色的猫」

    随着移动互联网的一路狂飙,手机已经成为人们的新器官.出门不带钥匙可以,不带手机却是万万不可以的.而手机上,小小的摄像头也越来越成为各位「vlogger」的口袋魔方.每天有超过数亿的照片和视频被上传到百 ...

  2. mini mp3模块 输出_小米有品众筹魔方mini电脑主机

    小米有品众筹上架了一个魔方mini电脑主机,金属机身,魔方一样的大小,口袋也能装下,出差携带很方便. 其售价999起,6+128GB版999元,8+256GB版1249元,漫威版8+256GB版售价1 ...

  3. 在虚幻引擎5中重塑火箭联盟——口袋联盟

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确) |大小解压后:3.28 GB |时长:4h 21m ...

  4. 云评测、云监测、云加速,性能魔方mmTrix全球速度最快

    在移动互联网高速发展的今天,互联网企业如果要实现业务增长,在激烈的市场竞争中站稳脚跟,必须要尽可能的提高用户体验和产品影响力.而要达实现这个目标,产品应用性能质量的好坏往往起到重要作用,APM服务受到 ...

  5. Matlab编程与数据类型 -- 奇数阶魔方矩阵的编程

    本微信图文详细介绍了利用Matlab实现奇数阶魔方矩阵的编程.

  6. Matlab与线性代数 -- 魔方矩阵

    本图文主要介绍了如何利用Matlab实现魔方矩阵.

  7. OpenAI机械手单手轻松解魔方,背靠强化学习+新技术ADR

    编译 | 夕颜 出品 | AI科技大本营(ID:rgznai100) [导读]10月15日,人工智能研究机构OpenAI发布了一条机械手单手解魔方的视频.这个自学式的类人机器人手臂名为 Dactyl, ...

  8. 0.38秒!MIT 机器人还原3阶魔方的时间再破记录

    作者 | Leo 魔方大家应该都玩过,能在短时间内还原魔方的孩子常常被很多家长认为是聪明的表现,人类目前还原三阶魔方的记录为4.69秒. 不过和围棋不一样,在这项竞技上,机器不给人类任何机会. 现在由 ...

  9. 求数的绝对值一定是正数_「口袋数学」绝对值的几何意义探究及应用,培优课程...

    哈喽,大家好!我们又见面了,欢迎继续关注[轩爸辅导]的[口袋数学].日更[每日一学][每日一练],帮助孩子日积月累,考出好的成绩.配套辅导,哪里不会学哪里,哪里出错练哪里,帮助孩子提高效率. 从数轴上 ...

最新文章

  1. SpringDataJpa根据多个id物品清单id查询房源编号
  2. eigen3.3.8帮助文档下载 chm_MAXHUB文档v1.10.1-MAXHUB文档电脑版下载
  3. 2015美国数学建模a代码c语言,1985~2015美国大学生数学建模竞赛题目集锦.docx
  4. 如何合理的配置线程数?
  5. centos7安装python3_详解Centos7升级python 2.7至Python 3.7
  6. 拳王公社:有哪些一个人就能做的创业赚钱项目?90后年赚30W逆袭案例!
  7. window启动过程讲解--PPT截图[张银奎]
  8. select 下拉框的选中项的change事件
  9. python36.dll下载_python36.dll
  10. 【转】暴露问题是对项目验收最起码的尊重!
  11. 端口冲突,可爱的8080
  12. 网站Webshell大马密码极速暴力爆破工具-cheetah
  13. SHFileOperation
  14. 关于计算机的想象类作文,想象类作文范文
  15. MAC电脑触摸板手势(提高办公效率)
  16. 十年后是计算机人员的作文,二十年后的电子计算机作文
  17. java计算机毕业设计民航售票管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  18. 自动化运维—ansible
  19. 设计原则之【开闭原则】
  20. 就业市场状况指数(LMCI)和非农数据

热门文章

  1. Android系统开机logo
  2. Host 'X.X.X.X' is blocked because of many connection errors; unblock with 'mysqladmin flush-ho
  3. JavaWeb——动态页面技术(JSP/EL/JSTL)
  4. PyCharm关闭更新提示
  5. 《3D Point Cloud Registration for Localization using a Deep Neural Network Auto-Encoder》读书笔记
  6. 【ES6】阮一峰ES6学习(一) let、const、解构赋值
  7. SSM三大框架整合(Spring+SpringMVC+MyBatis)
  8. 评论:“哭不起”的王君为何还流泪
  9. Python批量制作抖音的卡点视频原来这么简单!
  10. 计算机更新配置卡住了,Windows系统更新时电脑卡住或崩溃怎么办-万兴恢复专家...