洛谷链接:https://www.luogu.org/problemnew/show/P2730

魔板

题目背景

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

2 6 8 4 5 7 3 1

输出样例#1:

7
BCABCCB

题解

比较简单,只需要略加一个哈希状压判重再bfs就好了,写状态转换的时候注意一下细节。  
另外,注意特判起点等于终点的情况,mod开小一点(血的MLE的教训)。

代码
#include<bits/stdc++.h>
using namespace std;
const int mod=1000007;
vector<int>hash[mod+5];
int step[50000][4],goal,p1=1,p2=1;
void c1(int *x)
{for(int i=1;i<=4;++i)swap(x[i],x[i+4]);
}
void c2(int *x)
{int t1=x[4],t2=x[8];for(int i=4;i>=2;--i)x[i]=x[i-1],x[i+4]=x[i+3];x[1]=t1;x[5]=t2;
}
void c3(int *x)
{int r[5];r[1]=x[2];r[2]=x[3];r[3]=x[6];r[4]=x[7];x[2]=r[3];x[3]=r[1];x[6]=r[4];x[7]=r[2];
}
int yan(int x[])
{int r=0;for(int i=1;i<=8;++i)r+=x[i],r*=10;return r/10;
}
void uny(int p,int *x)
{for(int i=8;i>=1;--i)x[i]=p%10,p/=10;
}
void in()
{int t[10];for(int i=1;i<=4;++i)scanf("%d",&t[i]);for(int i=8;i>=5;--i)scanf("%d",&t[i]);goal=yan(t);
//  printf("g:%d\n",goal);step[1][0]=12348765;if(goal==12348765)printf("0"),exit(0);
}
void check(int x,int k)
{int n=x%mod;for(int i=hash[n].size()-1;i>=0;--i)if(hash[n][i]==x)return;hash[n].push_back(x);step[++p2][0]=x;step[p2][1]=k+'A'-1;step[p2][2]=p1;step[p2][3]=step[p1][3]+1;
//  printf("%d %d\n",k,x);
}
void ac(int v)
{if(!step[v][2])return;ac(step[v][2]);printf("%c",step[v][1]);
}
void bfs()
{int f,t,x[10];while(p1<=p2){f=step[p1][0];for(int i=1;i<=3;++i){uny(f,x);//  printf("f:%d\n",f);if(i==1)c1(x);if(i==2)c2(x);if(i==3)c3(x);t=yan(x);check(t,i);if(t==goal){printf("%d\n",step[p2][3]);return;}}p1++;}
}
int main()
{in();bfs();ac(p2);return 0;
}

Luogu2730 魔板 Magic Squares相关推荐

  1. 魔板 Magic Squares(bfs优化)

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

  2. [USACO3.2]魔板 Magic Squares

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

  3. P2730 魔板 Magic Squares

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

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

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

  5. P2730 魔板 Magic Squares (搜索)

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

  6. Magic Squares 魔板 (BFS+HASH)

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

  7. USACO 3.2 Magic Squares 魔板

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

  8. java51游戏_Java作业实践(一)魔板游戏

    课题:魔板游戏 一.课设要求 1.基本功能 (1)游戏规则 一个3×3的魔板,有一个格子是空的,其他格子内随机放置1-8共8个编号的方块,通过单击任意一个与空格子相邻的方块可以把该方块移入空格子,不断 ...

  9. 【题解】Luogu P2730 魔板

    蒟蒻的第一道蓝题--好像也没有蓝的程度 一篇无STL的超弱题解(入门写法无误了QAQ 传送门 很经典的一道BFS 这是初始状态. 操作A 操作B 操作C 思路1 不使用cantor展开的情况 1. 对 ...

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

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

最新文章

  1. transient HashMap使用目的分析
  2. 台湾国立大学郭彦甫Matlab教程笔记(8)文件读写
  3. Chart of Accout-科目表
  4. AUTOSAR从入门到精通100讲(三十五)-Lin通信协议栈分析三部曲LinTrcv配置及代码分析
  5. 分享一些看了就能用的面试技巧
  6. server sql top速度变慢解决方案_SQL Server的性能调优:解决查询速度慢的五种方法-数据库...
  7. jeecg 分布式部署附件共享问题(Linux软连接和硬链接)
  8. flask-配置的设置-三种配置的实现方法
  9. 利用Delphi编写Socket通信程序
  10. 若依如何调整首页左侧菜单栏宽度?
  11. php foreach 不等于_你不知道的接口测试之简单的开始
  12. 逸管家:别只共享单车,互联网时代还可以共享人才
  13. javascript释放对象_一文深入理解JavaScript如何运作
  14. 这是我的脚本原型。。比我的生成器的麻烦(这种最稳定,我做成的脱机刷毛实
  15. 在计算机上最常用的英语单词,计算机常用英语单词
  16. wim工具扫描linux磁盘,图文解说WIMTOOL的安装及利用该工具编辑WIM文件
  17. 编译和push services.jar的方法
  18. 启动Nginx报错nginx: [emerg] getpwnam(
  19. 7⽂件查找和压缩问题和练习
  20. 微信群打卡小程序_用微信小程序“小打卡”,打造免费的阅读平台!

热门文章

  1. Raki的读paper小记:Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
  2. 1个系统节拍 c语言_【课程】乐理知识讲重点第九课(节拍与节奏)
  3. 注解 @EnableFeignClients 与 @ComponentScan 有冲突
  4. 用傅里叶分析得到频域信息 MATLAB,信号分析实验_傅里叶matlab实现.doc
  5. 从mysql全备 导入指定数据库的数据:三种考虑方法
  6. 拦截器(Interceptor)和过滤器(Filter)区别
  7. python脚本报错:OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
  8. 58-最小乘积(基本型)
  9. FastReport.Net使用:[18]形状(Shape)控件用法
  10. 14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制: