题目背景

在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板。这是一张有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”:魔板中央四格作顺时针旋转。

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

A: 8 7 6 5

1 2 3 4

B: 4 1 2 3

5 8 7 6

C: 1 7 2 4

8 6 3 5

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

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

输入格式

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

输出格式

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

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

输入输出样例

输入 #1复制

  1. 2 6 8 4 5 7 3 1
输出 #1复制

  1. 7
  2. BCABCCB

说明/提示

题目翻译来自NOCOW。

USACO Training Section 3.2

解析:-----BFS宽搜-----

对于状态采用了字符串的存储是采用了将八个数字压成一个字符串的方式
例如初始状态为"12345678",而字符串存储为"12348765" 。
然后根据三个变换规则ABC进行变换
直到变成了目标状态
注意目标状态也要第二部分翻转
例如"26845731",存储为"26841375"。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<string>
  6. #include<algorithm>
  7. #include<iomanip>
  8. #include<cstdlib>
  9. #include<queue>
  10. #include<set>
  11. #include<map>
  12. #include<stack>
  13. #include<vector>
  14. #define LL long long
  15. #define re register
  16. #define Max 100001
  17. struct MoBan {
  18. std::string p;
  19. std::string str;
  20. int step;
  21. };
  22. std::queue<MoBan>q;
  23. std::string D;
  24. int ans;
  25. std::map<std::string,int>m;
  26. std::string BFS()
  27. {
  28. MoBan now,net;
  29. while(!q.empty()) {
  30. now=q.front();q.pop();
  31. std::string str=now.str;
  32. int t=now.step;
  33. std::string p=now.p;
  34. if(str==D) {
  35. ans=t;
  36. return p;
  37. break;
  38. }
  39. ++t;
  40. //A
  41. std::string d="";
  42. for(re int i = ; i <= ; ++ i) d+=str[i];
  43. for(re int i = ; i <= ; ++ i) d+=str[i];
  44. net.str=d;net.p=p+"A";
  45. net.step=t;
  46. if(m[d]!=) q.push(net),m[d]=;
  47. //B
  48. std::string a="";
  49. a+=str[];
  50. for(re int i = ; i < ; ++ i) a+=str[i];
  51. a+=str[];
  52. for(re int i = ; i < ; ++ i) a+=str[i];
  53. net.str=a;net.p=p+"B";
  54. if(m[a]!=) q.push(net),m[a]=;
  55. //C
  56. std::string c="";
  57. c+=str[],c+=str[],c+=str[],c+=str[],c+=str[],c+=str[],c+=str[],c+=str[];
  58. net.str=c;net.p=p+"C";
  59. if(m[c]!=) q.push(net),m[c]=;
  60. }
  61. }
  62. int main()
  63. {
  64. char ch[];std::string str="";
  65. for(re int i = ; i <= ; ++ i) std::cin >> ch[i];
  66. for(re int i = ; i <= ; ++ i) D+=ch[i];
  67. for(re int i = ; i >= ; -- i) D+=ch[i];
  68. MoBan now;m[str]=;
  69. now.p="";now.step=;now.str=str;q.push(now);std::string p=BFS();
  70. printf("%d\n",ans);
  71. int len=p.length();std::cout << p[];
  72. for(re int i = ; i < len ; ++ i) {
  73. std::cout << p[i];
  74. if(i%==) std::cout << '\n';
  75. }
  76. return ;
  77. }

AC代码

洛谷P2730 [IOI]魔板 Magic Squares的更多相关文章

  1. 题解【洛谷P2730】魔板 Magic Squares

    题面 首先我们可以发现,在每一次 BFS 时按照 \(A→B→C\) 的顺序枚举遍历肯定是字典序最小的. 然后就是普通的 BFS 了. 我们考虑使用 \(\text{STL map}\) 来存储起点状 ...

  2. 【简●解】 LG P2730 【魔板 Magic Squares】

    LG P2730 [魔板 Magic Squares] [题目背景] 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 ...

  3. 哈希+Bfs【P2730】 魔板 Magic Squares

    没看过题的童鞋请去看一下题-->P2730 魔板 Magic Squares 不了解康托展开的请来这里-->我这里 至于这题为什么可以用康托展开?(瞎说时间到. 因为只有8个数字,且只有1 ...

  4. 洛谷 P2730 魔板 Magic Squares 解题报告

    P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...

  5. [洛谷P2730] 魔板 Magic Squares

    洛谷题目链接:魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都 ...

  6. 洛谷 P2730 魔板 Magic Squares

    P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...

  7. [USACO3.2]魔板 Magic Squares

    松下问童子,言师采药去. 只在此山中,云深不知处.--贾岛 题目:魔板 Magic Squares 网址:https://www.luogu.com.cn/problem/P2730 这是一张有8个大 ...

  8. 「一本通 1.4 例 2」[USACO3.2]魔板 Magic Squares

    [USACO3.2]魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题 ...

  9. P2730 魔板 Magic Squares

    题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...

随机推荐

  1. Java之数据类型讲解

    Java数据类型关系图 基本数据类型 从小到大的关系图: 图中从左向右的转换都是隐式转换,无需再代码中进行强制转换 : byte i = 12; System.out.println("by ...

  2. C#泛型集合之——列表

    列表基础 1.列表概述:列表与哈希集合不同之处在于,它的元素可以重复.(更接近逻辑上的数组,而哈希集合更接近于数学上的集合) 2.创建及初始化: (1)List<类型> 列表名 =new ...

  3. docker save load export import的区别

    export export命令用于持久化容器(不是镜像).所以,我们就需要通过以下方法得到容器ID: sudo docker ps -a 接着执行导出: sudo docker export < ...

  4. flask与flask-script的使用

    flask与flask-script的使用 一.安装 pip install Flask-Script 二.简单的使用 # manage.py from flask_script import Man ...

  5. 一个爬虫的demo,requests,beatuifulsoup使用的

    爬虫的demo,requests,beatuifulsoup import os,re import requests import random import time from bs4 impor ...

  6. vue中is与:is的区别

    简略回答 假设父组件中有一个show数据,show="one":is="show"-->实际上是is="one" is="s ...

  7. 软工作业 wc-java

    项目要求: 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 具体功能 -c 返回文件字符数 -w 返回词的数目 -l 返回行数 扩展 ...

  8. VirtualBox下设置 XP虚拟机桥接模式

    virtualBox下设置虚拟机桥接模式

  9. PDF 补丁丁 0.6.2 测试版发布

    如题. 不知不觉,这个软件已经出来十个年头了. 0.6.2 版可能是 PDF 补丁丁的最后一版.它在未来将不再更新.谢谢关注.

  10. 谈谈OAuth1,OAuth2异同

    ##一.写在前面在收集资料时,我查询和学习了许多介绍OAuth的文章,这些文章有好有坏,但大多是从个例出发.因此我想从官方文档出发,结合在stackoverflow上的一些讨论,一并整理一下.整理的内 ...