杰哥自从接触魔方之后就对它非常入迷。经过夜以继日的练习,终于领悟了魔方的奥妙,成为一代宗师。王司令觉得杰哥太牛逼了,一直给杰哥拍马屁,希望能得到杰哥的真传。但是杰哥一直不肯告诉他。王司令非常生气,决定自己私下好好练习魔方,超过杰哥。 第一次接触魔方,不知道怎么玩,但他相信,只要坚持下去,他一定会成功的。在王司令成功路上,需要你的帮助。现在王司令手上有一个魔方,希望你能帮他还原这个魔方。

下图给出了魔方的还原状态的展开图

下图给出了从还原状态经过一次操作后的展开图,其他操作均能通过下方的六种组合操作达成

输入格式:
在一行内按如下顺序给出魔方的初始状态
其中Y为黄色,B为蓝色,R为红色,G为绿色,O为橙色,W为白色

输出格式:
在一行内输出能将魔方还原的最短步骤,如有多种可能,输出字典序最小的情况
步骤通过 U,u,F,f,R,r 共六种操作表示
其中魔方的还原状态为YYYYBBRRGGOOBBRRGGOOWWWW

输入样例:
YYBRRWRGYOBBBWRGYGOOGOWW
输出样例:
fu
数据范围:
对于30%的数据,打乱步骤不超过4步,
对于50%的数据,打乱步骤不超过7步,
对于100%的数据,打乱步骤不超过10步。

思路
我好懒!!!不想思考了!!!喵的!!!明天更!!!

#pragma GCC optimize(2)
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <unordered_map>using namespace std;
typedef pair<string, string> PII;
typedef unsigned long long LL;
const string s_final = "YYYYBBRRGGOOBBRRGGOOWWWW";unordered_map<string, string> mp;
char t_color[12];
char int2char[6] = {'F', 'f', 'U', 'u', 'R', 'r'};
int op[6][2][12] = {//前层右转 F{{5 , 13, 3 , 2 , 8 , 16, 20, 21, 6 , 7 , 15, 14},{3 , 2 , 16, 8 , 21, 20, 5 , 13, 7 , 15, 14, 6 }},//前层左转 f{{3 , 2 , 16, 8 , 21, 20, 5 , 13, 7 , 15, 14, 6 },{5 , 13, 3 , 2 , 8 , 16, 20, 21, 6 , 7 , 15, 14}},//上层右转 U{{4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 0 , 1 , 3 , 2 },{10, 11, 4 , 5 , 6 , 7 , 8 , 9 , 1 , 3 , 2 , 0 }},//上层左转 u{{10, 11, 4 , 5 , 6 , 7 , 8 , 9 , 1 , 3 , 2 , 0 },{4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 0 , 1 , 3 , 2 }},//右层后转 R {{7 , 15, 1 , 3 , 10, 18, 21, 23, 8 , 9 , 17, 16},{1 , 3 , 18, 10, 23, 21, 7 , 15, 9 , 17, 16, 8 }},//右层前转 r{{1 , 3 , 18, 10, 23, 21, 7 , 15, 9 , 17, 16, 8 }, {7 , 15, 1 , 3 , 10, 18, 21, 23, 8 , 9 , 17, 16}}
};string trans_with(string st, int opr) {int* fr = op[opr][0];int* to = op[opr][1];for (int i = 0; i < 12; ++i) t_color[i] = st[fr[i]];for (int i = 0; i < 12; ++i) st[to[i]] = t_color[i];return st;
}void print_way(const string &res) {for (int i = 0; i < res.size(); ++i)printf("%c", int2char[res[i]]);// printf("%d%c",res[i], int2char[res[i]]);puts("");
}string bfs(string s_start) {if (s_start == s_final) return "";queue<string> q;q.push(s_start);mp.insert({s_start, ""});while (q.size()) {string tmp = q.front();q.pop();string op_st = mp[tmp];for (int i = 0; i < 6; ++i) {int len = op_st.size();if (len && ((op_st[len - 1] ^ i) == 1)) continue;if (len >= 2 && (op_st[len - 2] == op_st[len - 1]) && (op_st[len - 1] == i)) continue;string t = trans_with(tmp, i);string op_t = op_st + (char)i;if (t == s_final) return op_t;auto it = mp.find(t);if (it == mp.end() || (it->second > op_t)) {mp.insert({t, op_t});q.push(t);}}}return "";
}int main() {string s_start;cin >> s_start;string res = bfs(s_start);print_way(res);return 0;
}

魔方复原(BFS+剪枝)相关推荐

  1. 跳跃游戏 (动态规划剪枝/前缀和/滑动窗口/BFS剪枝)

    一.跳跃游戏简单介绍 1. 跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步, ...

  2. c++/qt/opencv实现魔方复原【娱乐】

    文章目录 前言 视频演示 一.项目工程目录 二.重要代码解析 1.Cube方块类 2.GLWidget界面构建 3.魔方还原 总结 前言 本文主要是对魔方还原进行测试,并且可通过键盘玩转魔方,然后自动 ...

  3. 超级详细的基础层先魔方复原法

    基础层先魔方复原法 by信手拈花 层先魔方复原法容易理解,是初学魔方者普遍采用的一种方法. 0.魔方转动的公式表示和复原步骤 0.1魔方转动的公式表示 魔方转动的公式表示 0.2层先法魔方复原步骤 底 ...

  4. 程设大作业xjb写——魔方复原

    鸽了那么久总算期中过[爆]去[炸]了...该是时候写写大作业了 [总不能丢给他们不会写的来做吧 一.三阶魔方的几个基本定义 ↑就像这样,可以定义面的称呼:上U下D左L右R前F后B UD之间的叫E,LR ...

  5. 2017icpc沈阳 G Infinite Fraction Path BFS+剪枝

    题意:给一个长度为n的字符串数组,你可以选定起点跳n次,从i点只能跳到(i*i+1)%n的位置,最后求一个最大字典序. 思路:要求最大的,即每一步都是最大,所以将最大的数都入队进行bfs跳下一步. 剪 ...

  6. Frog Traveler 最短路,bfs剪枝,打印路径

    题意 : 给两个长度为n的数组,初始位于索引n,目标是越过索引1,注意不能往后跳,每次可以跳0到a[i]a[i]a[i]米,即,身处索引iii,可以跳[0,a[i]][0, a[i]][0,a[i]] ...

  7. 力扣 1553. 吃掉 N 个橘子的最少天数 记忆化DFS|记忆化BFS|剪枝

    吃掉 N 个橘子的最少天数 厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子. 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子. 如果剩余橘子数 n ...

  8. BNUOJ 51277 魔方复原(模拟、置换)

    题意: 给定N≤105的三阶魔方操作序列给定N\le10^5的三阶魔方操作序列 由U.D.R.L.F.B操作构成,如下图:由U.D.R.L.F.B操作构成,如下图: 操作序列表示如下,R≤109:操作 ...

  9. 2010年湖南省第六届大学生程序设计大赛 F题 “Biggest Number” CSG - 1051 // UVA 11882 (dfs+bfs+剪枝)

    题目链接 一.题目内容 一个r行c列的矩阵,里面只有1-9的数字和'#',最开始可以随意挑选一个数字然后可以上下左右移动,问所走的路径所含数字最大为多少. 样例解释 input 3 7 ##9784# ...

最新文章

  1. java-unrar-0.3.jar_unrar.jar解压缩rar文件
  2. c++派生类的访问控制
  3. 脚本语言和工程语言_语言工程中有趣的事情
  4. docker绑定端口主机访问curl: (56) Recv failure: Connection reset by peer
  5. centos mysql 5.6 源码_Centos7环境中mysql-5.6.39 源码安装
  6. 《计算机网络 自顶向下方法》(第7版)答案(第六章)(二)
  7. Arduino使用NRF24L01模块进行无线通信
  8. 编码:隐匿在计算机软硬件背后的语言
  9. 关于GTP-4,这是14个被忽略的惊人细节!
  10. oracle口试问题,Oracle口试复习(二)
  11. wordpress友联_Wordpress进阶:个性化友情链接调用
  12. 【蓝桥云课】最大公约数与最小公倍数
  13. Mesalink v1.0.0 发布,正式支持 TLS 1.3 和 IPv6,支持CMake编译,支持Windows,实现生产环境可用...
  14. 韩钰带你一起走进电商世界之淘宝店铺设计尺寸规范
  15. Java输出直角三角形方法
  16. 从100PV到1亿级PV网站架构演变
  17. 调用ThunderAgent 迅雷局域网版的开发
  18. NFT Insider #52:元宇宙游戏Gotchiverse上线,The Sandbox入选《时代》榜单
  19. 毕业论文ppt的研究方法及过程计算机专业,本科毕业论文的开题报告ppt
  20. Java 登录安全漏洞防护

热门文章

  1. 从 smali 接入第三方 sdk
  2. sFlow - 简介
  3. python去重计数_用Python做透视表之value_sum和value_countdistinct功能
  4. WORD文档中插入图片(1)
  5. CAD软件中沿墙镜像功能的使用技巧
  6. 【HCIE TAC】第二题
  7. AE效果:过时与抠像
  8. JavaScript基本数据类型之String 和 Boolean
  9. 查找Mac序列号的9种方法
  10. 【小米商城】--类别展示,登出,注销商品详情展示