【题目描述】

在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板。这是一张有8个大小相同的格子的魔板:

1 2 3 4
8 7 6 5

我们知道魔板的每一个方格都有一种颜色。这8种颜色用前8个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示。这是基本状态。

这里提供三种基本操作,分别用大写字母“A”,“B”,“C”来表示(可以通过这些操作改变魔板的状态):

“A”:交换上下两行;

“B”:将最右边的一行插入最左边;

“C”:魔板中央作顺时针旋转。

下面是对基本状态进行操作的示范:

8 7 6 5      4 1 2 3      1 7 2 4
A: 1 2 3 4   B: 5 8 7 6   C: 8 6 3 5

对于每种可能的状态,这三种基本操作都可以使用。

你要编程计算用最少的基本操作完成基本状态到特殊状态的转换,输出基本操作序列。

【输入】

只有一行,包括8个整数,用空格分开(这些整数在范围 1——8 之间),表示目标状态。

【输出】

Line 1:包括一个整数,表示最短操作序列的长度。

Line 2:在字典序中最早出现的操作序列,用字符串表示,除最后一行外,每行输出60个字符。

【输入样例】

2 6 8 4 5 7 3 1

【输出样例】

7
BCABCCB

思路:

很容易想到用 BFS 来做,即找到 A、B、C 三种操作的规律,然后进行搜索,将搜索到的状态加入 BFS 的队列中,这样 8 个位置上的数就要转换成一个 8 位数,判重时要长度 10^8 的的数组,开不了这么大的数组

因此本题的难度就在于判重,网上的题解多有使用康拓展开来进行状态判定从而去从去重的,但其实可以使用 map 来作为 vis 数组,即将 8 个位置上的数转成一个 string 的形式,然后当做 map 的键,其对应的值即为达到该状态的操作符

因此只要写三个函数将操作序列 A、B、C 模拟一下,然后 BFS 即可

【源程序】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
#define Pair pair<int,int>
LL quickPow(LL a,LL b){ LL res=1; while(b){if(b&1)res*=a; a*=a; b>>=1;} return res; }
LL multMod(LL a,LL b,LL mod){ a%=mod; b%=mod; LL res=0; while(b){if(b&1)res=(res+a)%mod; a=(a<<=1)%mod; b>>=1; } return res%mod;}
LL quickMultPowMod(LL a, LL b,LL mod){ LL res=1,k=a; while(b){if((b&1))res=multMod(res,k,mod)%mod; k=multMod(k,k,mod)%mod; b>>=1;} return res%mod;}
LL quickPowMod(LL a,LL b,LL mod){ LL res=1; while(b){if(b&1)res=(a*res)%mod; a=(a*a)%mod; b>>=1; } return res; }
LL getInv(LL a,LL mod){ return quickPowMod(a,mod-2,mod); }
LL GCD(LL x,LL y){ return !y?x:GCD(y,x%y); }
LL LCM(LL x,LL y){ return x/GCD(x,y)*y; }
const double EPS = 1E-6;
const int MOD = 1000000000+7;
const int N = 1000+5;
const int dnewStr[] = {0,0,-1,1,1,-1,1,1};
const int dy[] = {1,-1,0,0,-1,1,-1,1};
using namespace std;queue<string> Q;
map<string, string> mp;
void opA(string oldStr) {string newStr = oldStr;swap(newStr[0], newStr[7]);swap(newStr[1], newStr[6]);swap(newStr[2], newStr[5]);swap(newStr[3], newStr[4]);if (mp.count(newStr) == 0) {Q.push(newStr);mp[newStr] = mp[oldStr] + "A";}
}
void opB(string oldStr) {string newStr = oldStr;swap(newStr[0], newStr[3]);swap(newStr[4], newStr[5]);swap(newStr[1], newStr[3]);swap(newStr[5], newStr[6]);swap(newStr[2], newStr[3]);swap(newStr[6], newStr[7]);if (mp.count(newStr) == 0) {Q.push(newStr);mp[newStr] = mp[oldStr] + "B";}
}
void opC(string oldStr) {string newStr = oldStr;swap(newStr[1], newStr[2]);swap(newStr[5], newStr[6]);swap(newStr[1], newStr[5]);if (mp.count(newStr) == 0) {Q.push(newStr);mp[newStr] = mp[oldStr] + "C";}
}
void BFS(string target) {Q.push("12345678");mp["12345678"] = "";while (!Q.empty()) {string str = Q.front();Q.pop();opA(str);opB(str);opC(str);if (mp.count(target) == 1) {cout << mp[target].length() << endl;cout << mp[target] << endl;break;}}
}
int main(){string str("12345678");cin >> str[0] >> str[1] >> str[2] >> str[3];cin >> str[4] >> str[5] >> str[6] >> str[7];BFS(str);return 0;
}

魔板(信息学奥赛一本通-T1449)相关推荐

  1. 题解 2360: [信息学奥赛一本通-T1449]魔板

    在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表 ...

  2. 信息学奥赛一本通_长乐一中老师演绎“奥赛传奇”

    董永建(右一)在课堂上. 台海网5月14日讯 据福州晚报报道,长乐一中有一位"传奇"老师--15年来,他辅导的学生在全国高中生信息学奥赛中获金牌3人次.银牌3人次.铜牌5人次:在全 ...

  3. 信息学奥赛一本通 提高篇 第5章 矩阵乘法

    例1 矩阵AXB 信息学奥赛一本通(C++版)在线评测系统 [矩阵乘法]矩阵A×B_Uletay-CSDN博客 矩阵乘法--矩阵A×B_vina的博客-CSDN博客 一本通1641[例 1]矩阵 A× ...

  4. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

  5. 《信息学奥赛一本通 提高篇》

    提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1章 贪心算法_青少年趣味编程-CSDN博客 提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1 ...

  6. 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分

    信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC

    http://ybt.ssoier.cn:8088/show_source.php?runid=14630195 /* 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC http:/ ...

  9. 信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂

    信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂 https://blog.csdn.net/mrcrack/article/details/82846727 快速幂取模算法如何实现? h ...

最新文章

  1. 智能驾驶时代已经到来
  2. UOJ#179. 线性规划(线性规划)
  3. bzoj 2878 [Noi2012]迷失游乐园——树上的期望dp
  4. js escape 与php escape
  5. 我的docker随笔15:MySQL启动时自动创建数据库
  6. spring_boot 与MyBatis 整合
  7. CentOS 6.5 安装 Python3
  8. VC++常用数据类型
  9. iterator接口
  10. 照片缩小尺寸怎么操作?
  11. 苏宁、国美2021重新出发
  12. 大数据常用web页面
  13. 计算机桌面时间设置,电脑时间校准,教您怎么校正电脑时间
  14. 笨办法学python习题39-40
  15. 为什么泛型类的类型不能是基本数据类型
  16. 哥德巴赫猜想python
  17. 说唱天王 Eminem 自传《The Way I am》2
  18. Mac使用OBS直播配置教程|解疑答惑
  19. python用四个圆画成花_【元旦手工】最美元旦手工花手工教程,赶紧提前收藏吧!...
  20. 有感无刷电机正反转电流差别大

热门文章

  1. 递增输出链表结点,删除重复结点
  2. 查看.Net Framework版本的方法
  3. 终于有人把「同侪效应」讲明白了
  4. 手把手教你使用Pandas读取结构化数据
  5. 必知!4张图看尽AI发展史重大里程碑
  6. 深入理解java虚拟机gc_java底层:GC相关——深入理解java虚拟机
  7. 求你了,听我一句劝吧,这几个玩意就别学了!
  8. 紧急通知!不要在MySQL中使用UTF-8编码!!!
  9. 数据源管理 | 主从库动态路由,AOP模式读写分离
  10. 数据交互智能终端设想