[USACO3.2]魔板 Magic Squares

题目背景

在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板。这是一张有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

7
BCABCCB

提示

题目翻译来自NOCOW。

USACO Training Section 3.2

思路

bfs优化。为了避免重复搜索超时,使用set优化,使出现过的不再搜第二次。也算是剪枝吧。

#include <bits/stdc++.h>
typedef long double ld;
typedef long long ll;
#define pb push_back
#define mk make_pair
#define mt make_tuple
#define eb emplace_back
#define pob pop_back
#define rz resize
#define mem(a,b) memset(a,b,sizeof(a))
#define all(a) (a).begin(),(a).end()
#define rall(a) (a).rbegin(),(a).rend()
#define debug(a) cout<<#a<<"="<<a<<endl;
#define xx first
#define yy second
#define qwe(i,a,b) for(int i=a;i<=b;i++)
#define ewq(i,a,b) for(int i=a;i>=b;i--)
inline ll rr(){ll f=1,x=0;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');return f*x;}
using namespace std;
// ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const ll INF=0x3f3f3f3f,inf=0x3f3f3f3f3f3f3f;
const ll mod[2]={int(1e9 + 7), 10007};
const int base[2]={29,31};
const int maxn=1e2+6;
ll qpow(ll x,ll n){ll ans=1;while(n>0){if(n&1)ans=ans*x%mod[1];x=x*x%mod[1];n>>=1;}return ans;}int aa[maxn];
set<string> se;
struct node {int t[maxn],st;string c;
};
bool check(int *s) {for(int i=0;i<8;i++) {if(s[i]!=aa[i]) return 0;}return 1;
}
string make_it_string(int *s) {string to;for(int i=0;i<8;i++) {to=to+char(s[i]+'0');}return to;
}
int main(int argc, char const *argv[]) {for(int i=0;i<4;i++) {aa[i]=rr();}for(int i=7;i>=4;i--) {aa[i]=rr();}queue<node> q;node n;for(int i=0;i<4;i++) {n.t[i]=i+1;}n.t[4]=8,n.t[5]=7,n.t[6]=6,n.t[7]=5;n.st=0,n.c="";q.push(n);while (!q.empty()) {node tmp=q.front();q.pop();string k=make_it_string(tmp.t);if(se.count(k)) continue;se.insert(k);if(check(tmp.t)) {std::cout << tmp.st << '\n';std::cout << tmp.c << '\n';return 0;}node now;// 第一种变换for(int i=4;i<8;i++) {now.t[i-4]=tmp.t[i];}for(int i=4;i<8;i++) {now.t[i]=tmp.t[i-4];}now.st=tmp.st+1;now.c=tmp.c+"A";q.push(now);// 第二种变换for(int i=0;i<3;i++) {now.t[i+1]=tmp.t[i];}for(int i=4;i<7;i++) {now.t[i+1]=tmp.t[i];}now.t[0]=tmp.t[3],now.t[4]=tmp.t[7];now.st=tmp.st+1;now.c=tmp.c+"B";q.push(now);// 第三种变换int rem=tmp.t[1];tmp.t[1]=tmp.t[5];tmp.t[5]=tmp.t[6];tmp.t[6]=tmp.t[2];tmp.t[2]=rem;for(int i=0;i<8;i++) now.t[i]=tmp.t[i];now.st=tmp.st+1;now.c=tmp.c+"C";q.push(now);}return 0;}

魔板 Magic Squares(bfs优化)相关推荐

  1. [USACO3.2]魔板 Magic Squares

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

  2. P2730 魔板 Magic Squares

    不看题解肯定不会系列... 这道题可以用Cantor展开解决. Cantor展开可以求出一个数组是在全排列中的第几个. 具体怎么操作自己百度. Cantor展开的公式是:\(a[1] * (n - 1 ...

  3. 洛谷P2730 [IOI]魔板 Magic Squares

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

  4. P2730 魔板 Magic Squares (搜索)

    题目链接 Solution 这道题,我是用 \(map\) 做的. 具体实现,我们用一个 \(string\) 类型表示任意一种情况. 可以知道,排列最多只有 \(8!\) 个. 然后就是直接的广搜了 ...

  5. Magic Squares 魔板 (BFS+HASH)

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

  6. USACO 3.2 Magic Squares 魔板

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

  7. HDU 1430 魔板(康托展开+BFS+预处理)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  8. 【BFS】魔板(c++基础算法)

    本专栏上一篇:[BFS]八数码问题(c++基础算法) 目录 一.读题 ①题面 ②题意 三.做题 ①算法原理 ②算法实现 Ⅰ三种基本操作 Ⅱ操作序列 Ⅲ输出 Ⅳ一个特殊情况 四.AC代码 最后 一.读题 ...

  9. hdu.1430.魔板(bfs + 康托展开)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

最新文章

  1. 深入Garbage First垃圾收集器(三)G1中的垃圾收集
  2. mysql能安装的版本下载失败_mysql 安装失败 每次都安装失败 每个版本都失败
  3. All are Same 思维,gcd
  4. pytorch学习笔记(三):线性回归
  5. 服务器每条消息都回复,如何理解PUSH消息送达成功率
  6. 野哥点评了Facebook、Amazon、Google、微软和苹果
  7. [python]python logging 模块
  8. mapinfo开发资料(转)
  9. VHDL——分频器设计
  10. 互联网巨头争先入局智能汽车,盛世昊通董车长运筹帷幄
  11. 第21届国际足联世界杯观后感
  12. float转int 四舍五入问题
  13. 关于win10 睡眠或关屏恢复后卡顿的问题
  14. HDFS文件系统的根目录和用户主目录解析
  15. 1026. 多米诺和三格骨牌铺瓦问题
  16. VS2019:C++程序lib静态库、dll动态库的生成和使用
  17. scrum立会报告+燃尽图(第三周第五次)
  18. 2020最新最好看的热门动漫电影推荐
  19. import java.util.* cannot be resolved或import java.io.*cannot be resolved解决方案
  20. 【SSL】记录一次PEM转P12证书

热门文章

  1. linux lcd cd,linux LCD调试
  2. Hive 的SQL基本操作
  3. IP交换机与路由器配置
  4. 水仙花案例与嵌套循环案例
  5. 计算机Excel设置透视图,电脑Excel表格中数据透视图怎么制作
  6. Oracle as 10g安裝問題
  7. SQL Server 简单模式下,误删除堆表记录如何恢复(绕过页眉校验) (转)
  8. 矩阵链乘法 自顶向下 自底向上 Python 实现 算法导论
  9. VBS 请求WebAPI接口_如何设计WEB API
  10. 4线触摸屏控制器ET2046介绍