魔方状态

题目描述
二阶魔方就是只有2层的魔方,只由8个小块组成。
如图p1.png所示。

小明很淘气,他只喜欢3种颜色,所有把家里的二阶魔方重新涂了颜色,如下:

前面:橙色
右面:绿色
上面:黄色
左面:绿色
下面:橙色
后面:黄色

请你计算一下,这样的魔方被打乱后,一共有多少种不同的状态。

如果两个状态经过魔方的整体旋转后,各个面的颜色都一致,则认为是同一状态。

请提交表示状态数的整数,不要填写任何多余内容或说明文字。

开始拿到这道题没什么思路,笔算算不来,模拟判重感觉太麻烦。大神说burnside引理可以做,学渣表示看不懂。。网上基本没有求解的,有的也答案不一。最后还是模拟判重这么写了。

我的答案:229878

测试:全同色魔方状态为1,正确。正常二阶魔方状态3674160,正确。

思路:其实就是空间状态搜索。模拟操作+判重。关于操作,二阶魔方只做U(顶层顺时针) R(右层顺时针) F(前层顺时针)就可以得到所有状态了。判重需要旋转整个魔方去比较。(判重小白现在只会用set)。

然后是,怎么去表示一个二阶魔方。二阶魔方8个块,一个块6面(看不见的作黑色考虑),所以我用了char st[8][7]去表示一个魔方。块的顺序如下:

上面的初始状态表示就是{{“oybbgb”},{“oygbbb”},{“bygbby”},{“bybbgy”},{“obbogb”},{“obgobb”},{“bbgoby”},{“bbbogy”}}

o表示橙色,b表示黑色,g表示绿色,y表示黄色。

对于一个小块,6个面的颜色定义顺序如下:

所以,比如说,上面题目给的魔方,前面一层,左上角的橙黄绿块,表示就是oybbgb

博主还是个小白,只能找来C++的代码,还望 Java大佬及时写出

#include <bits/stdc++.h>
using namespace std;
typedef char st[8][7];
st state[2000000];
set<string> all;
st begin={{"oybbgb"},{"oygbbb"},{"bygbby"},{"bybbgy"},{"obbogb"},{"obgobb"},{"bbgoby"},{"bbbogy"}};
//st begin={{"oooooo"},{"oooooo"},{"oooooo"},{"oooooo"},{"oooooo"},{"oooooo"},{"oooooo"},{"oooooo"}};
//只有一个颜色的魔方 ans=1
//st begin={{"rykkbk"},{"rygkkk"},{"kygkko"},{"kykkbo"},{"rkkwbk"},{"rkgwkk"},{"kkgwko"},{"kkkwbo"}};
//正常2阶魔方状态  r红 y黄 b蓝 g绿 w白 o橙  k黑(红对橙,白对黄,蓝对绿,颜色相近的相对)这里白为底 前为红
//需要将state大小改为4000000
//这个测试用例跑了20分钟左右 560M内存  ans=3674160 与实际二阶魔方状态数相同 见下截图
int front, tail;
void ucell(char *a){swap(a[0], a[2]); swap(a[2], a[5]); swap(a[5], a[4]);}
void rcell(char *a){swap(a[1], a[0]); swap(a[0], a[3]); swap(a[3], a[5]);}
void fcell(char *a){swap(a[2], a[1]); swap(a[1], a[4]); swap(a[4], a[3]);}
void u(st &s)//顶层顺时针旋转
{ucell(s[0]);ucell(s[1]);ucell(s[2]);ucell(s[3]);swap(s[1], s[0]);swap(s[2], s[1]);swap(s[3], s[2]);
}
void uwhole(st &s)//整个魔方从顶部看 顺时针转 用于判重
{u(s);ucell(s[4]);ucell(s[5]);ucell(s[6]);ucell(s[7]);swap(s[5], s[4]);swap(s[6], s[5]);swap(s[7], s[6]);
}
void f(st &s)//前面一层 顺时针转
{fcell(s[0]);fcell(s[1]);fcell(s[4]);fcell(s[5]);swap(s[1], s[5]);swap(s[0], s[1]);swap(s[4], s[0]);
}
void fwhole(st &s)//整个魔方从前面看 顺时针转 用于判重
{f(s);fcell(s[2]);fcell(s[6]);fcell(s[7]);fcell(s[3]);swap(s[2], s[6]);swap(s[3], s[2]);swap(s[7], s[3]);
}
void r(st &s)//魔方右层顺时针转
{rcell(s[1]);rcell(s[2]);rcell(s[6]);rcell(s[5]);swap(s[2], s[1]);swap(s[5], s[1]);swap(s[6], s[5]);
}
void rwhole(st &s)//整个魔方从右边看 顺时针转 用于判重
{r(s);rcell(s[0]);rcell(s[3]);rcell(s[4]);rcell(s[7]);swap(s[3], s[7]);swap(s[0], s[3]);swap(s[4], s[0]);
}
string convert(st &s)//魔方状态二维字符数组 转化为string
{string ss;for(int i=0; i<8; i++)ss+=s[i];return ss;
}
bool try_to_insert(int tail)//判重
{st k;memcpy((void*)k, (void*)state[tail], sizeof(state[tail]));for(int i=0; i<4; i++){fwhole(k);for(int j=0; j<4; j++){uwhole(k);for(int q=0; q<4; q++){rwhole(k);if(all.count(convert(k))==1){return false;}}}}all.insert(convert(k));return true;
}
int main()
{front=0,tail=1;all.insert(convert(begin));memcpy((void*)state[0],(void*)begin,sizeof(begin));while(front!=tail){//对当前状态分别模拟三种操作U R F 然后判重 for(int i=0; i<3; i++){memcpy((void*)state[tail], (void*)state[front], sizeof(state[front]));if(i==0){u(state[tail]);if(try_to_insert(tail))tail++;}else if(i==1){r(state[tail]);if(try_to_insert(tail))tail++;}else if(i==2){f(state[tail]);if(try_to_insert(tail))tail++;}}front++;}cout<<front<<endl;return 0;
}
//ans 229878

Java实现第八届蓝桥杯魔方状态相关推荐

  1. 2017 第八届蓝桥杯 魔方状态

    标题:魔方状态 二阶魔方就是只有2层的魔方,只由8个小块组成.如图p1.png所示. 小明很淘气,他只喜欢3种颜色,所有把家里的二阶魔方重新涂了颜色,如下: 前面:橙色 右面:绿色 上面:黄色 左面: ...

  2. Java实现第八届蓝桥杯图形排版

    标题:图形排版 小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi. 假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版: 1. 该工具会按照 ...

  3. Java实现第八届蓝桥杯青蛙跳杯子

    青蛙跳杯子 题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色.X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去.如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有 ...

  4. Java实现第八届蓝桥杯拉马车

    拉马车 题目描述 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. 其规则简述如下: 假设参加游戏的小朋友是A和B,游戏开始的时候,他们得到的 ...

  5. Java实现第八届蓝桥杯日期问题

    日期问题 题目描述 小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都在1960年1月1日至2059年12月31日.令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/ ...

  6. Java实现第八届蓝桥杯兴趣小组

    兴趣小组 为丰富同学们的业余文化生活,某高校学生会创办了3个兴趣小组 (以下称A组,B组,C组). 每个小组的学生名单分别在[A.txt],[B.txt]和[C.txt]中. 每个文件中存储的是学生的 ...

  7. Java实现第八届蓝桥杯分巧克力

    分巧克力 题目描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧 ...

  8. Java实现第八届蓝桥杯9算数式

    9算数式 题目描述 观察如下的算式: 9213 x 85674 = 789314562 左边的乘数和被乘数正好用到了1~9的所有数字,每个1次. 而乘积恰好也是用到了1~9的所有数字,并且每个1次. ...

  9. Java实现第八届蓝桥杯外星日历

    外星日历 题目描述 某星系深处发现了文明遗迹. 他们的计数也是用十进制. 他们的文明也有日历.日历只有天数,没有年.月的概念. 有趣的是,他们也使用了类似"星期"的概念, 只不过他 ...

最新文章

  1. Linux使用expect自动登录,linux中使用expect实现自动登录(示例代码)
  2. 【数据结构】单链表的逆序输出(两种方法)
  3. 英伟达开源自动驾驶AI算法,升级芯片性能7倍于Xavier
  4. 股价相对于转股价溢价的时候,可转债就是折价状态。这就意味着只要正股保持目前的价格,赚钱的概率较高。...
  5. oracle pcm x6-2,Sun 7310210服务器Oracle X6-2原装拆机内存7310244 7090170
  6. InstallShield与Visual Studio
  7. 【城市沙龙】LiveVideoStack Meet|杭州:多媒体新黄金时代
  8. java商品管理系统_【Java Web】简易商品信息管理系统——首个Web项目
  9. python爬取斗鱼弹幕_【Python3爬虫】斗鱼弹幕爬虫
  10. 微软更新补丁下载地址
  11. Nexus3 功能介绍
  12. Unity从Asset Store下载的资源安装包默认的保存位置及其修改
  13. 一战托福5个月112分 经验分享 + 备考资料大放送
  14. Android 9 按音量键音量调节流程
  15. VC++编写USB接口通讯程序
  16. CLIP论文阅读、zero-shot实验、linear prob实验记录
  17. 小米8检查更新显示服务器连接失败,小米助手常见问题及解决方案
  18. java鱼游动源码_java版大鱼吃小鱼游戏
  19. ggplot绘制柱状图 python_ggplot2堆积柱形图笔记
  20. 在线去除 kindle 书籍 azw格式 DRM保护

热门文章

  1. 快速验证矩阵求MP广义逆及最小范数解或最小二乘解是否正确
  2. PWM调速风扇的正负极在哪?
  3. data,bss和rodata段的区别与联系
  4. 【PM】1 新产品开发战略-详解NPDP(2)
  5. 招聘区块链底层开发工程师(深圳)
  6. 西藏之旅,忙碌的人都应该去一次
  7. utils系列 python将jp2图像格式转为jpg可读格式
  8. android面试基础知识,小程序FMP优化实录,经典好文
  9. 零售业的商品交叉价格弹性
  10. 交易员学堂第五课 海龟交易法则的术与道