一些废话

夜深人静的夜晚,我开了这道题。看起来,完成它是一件轻而易举的事。我想了想,打开Dev-C++,开始写代码。

然而,那时的我还不知道,我踏入了深渊......

咳咳,中二病犯了,前面的文字请忽略。

思路

题目要求最少操作次数,显然,我们要使用BFS来求解。

对于每个节点,接下来有最多三个子节点,用函数模拟即可。

因为要求输出操作序列,所以需要存储每个节点的父节点。

细节

我们还需要对魔板进行去重操作来剪枝。

这是因为:

由于BFS的特性,当一个魔板第一次出现时,得到它所需要的操作次数是最少的;如果它出现了多次,那么与首次出现相比,它所需的操作次数更多。从该魔板出发还原成目标魔板时,如果从第一个魔板出发,所用的总次数最少;而多次出现的必然比首次出现的所用的总次数多。

因此通过去重操作进行剪枝是必要的,这会使原本MLE的程序AC(作者亲身经历)。

别忘了输出60个字符就要换行。

另外,当目标模板与初始模板一致时,需要直接输出0,结束程序。

实现

变量等命名不规范,望见谅。

#include <cstdio>
#define N 10000005
#define fot(x,y,z) for(int x=y;x<=z;x++)
#define tof(x,y,z) for(int x=y;x>=z;x--)
int bd[9],bb[9];
int b2[9];
int q[N][9];
int dep[N];
int list[N];
char stk[N];
int fa[N];
bool exis[16777216];
void swap(int &x,int &y)
{
int temp=x;
x=y;
y=temp;
}
void A()
{
fot(i,1,4)
swap(bd[i],bd[9-i]);
}
void B()
{
int f[2];
f[0]=bd[4];
f[1]=bd[5];
tof(i,3,1)
bd[i+1]=bd[i];
fot(i,6,8)
bd[i-1]=bd[i];
bd[1]=f[0];
bd[8]=f[1];
}
void C()
{
int temp=bd[2];
bd[2]=bd[7];
bd[7]=bd[6];
bd[6]=bd[3];
bd[3]=temp;
}
void setts(int i)
{
fot(j,1,8)
q[i][j]=bd[j];
}
void getts(int i)
{
fot(j,1,8)
bd[j]=q[i][j];
}
bool judge()
{
fot(i,1,8)
{
if(bd[i]!=b2[i])
return 0;
}
return 1;
}
void print(int x)
{
printf("%d\n",dep[x]);
int i;
for(i=1;x;i++)
{
stk[i]=list[x]-1+'A';
x=fa[x];
}
int cnt=0;
tof(j,i-1,1)
{
cnt++;
printf("%c",stk[j]);
if(cnt%60==0)
printf("\n");
}
}
bool exist()
{
int number=0;
fot(i,1,8)
number=number*8+bd[i]-1;
if(exis[number])
return 1;
else
{
exis[number]=1;
return 0;
}
}
int main()
{
fot(i,1,8)
scanf("%d",&b2[i]);
fot(i,1,8)
bd[i]=i;
if(judge())
{
printf("0");
return 0;
}
int head=0,tail=0;
setts(0);
fa[0]=-1;
while(head<=tail)
{
getts(head);
fot(i,1,3)
{
if(i==1) A();
if(i==2) B();
if(i==3) C();
if(exist())
{
getts(head);
continue;
}
tail++;
list[tail]=i;
fa[tail]=head;
setts(tail);
dep[tail]=dep[head]+1;
if(judge())
{
print(tail);
return 0;
}
getts(head);
}
head++;
}
}

P2730 [USACO3.2] 魔板 Magic Squares 题解的更多相关文章

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

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

  2. [USACO3.2]魔板 Magic Squares

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

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

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

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

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

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

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

  6. 洛谷 P2730 魔板 Magic Squares

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

  7. [洛谷P2730] 魔板 Magic Squares

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

  8. P2730 魔板 Magic Squares

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

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

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

  10. 魔板 Magic Squares(广搜,状态转化)

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

随机推荐

  1. Elasticsearch之权限验证(Basic)

    目前使用的Es版本为7.5版本, 在7.X版本中已经可以免费的使用x-pack进行用户验证了 1. 修改elasticsearch主节点配置文件: action.destructive_require ...

  2. ZCMU-1136

    思路 一个数学问题 要知道1为奇数,2^x次方一定为偶数. 偶数=奇数+奇数,而奇数=奇数*奇数,所以x一定要是奇数才可以. 注意 没告诉范围所以要往大的方向考虑 其中1能够被任一整数整除,所以前面加 ...

  3. Docker安装开源版obs对象存储服务minio,并后台运行

    ​​>Minio 是一个基于Apache License v2.0开源协议的对象存储服务,虽然轻量,却拥有着不错的性能.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据. 例如 ...

  4. Shiro简单入门+个人理解

    身为一个刚刚进入开发行业的学生,进入公司就开始了Shiro框架的应用,特此在这里写下收获. Shiro是apache旗下一个开源安全框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权 ...

  5. 中电金信:源启混沌工程平台(V4)与东方通TongwebV7.0完成适配认证

    ​近日,源启混沌工程平台(V4)与北京东方通科技股份有限公司(以下简称东方通)应用服务器软件东方通TongwebV7.0完成产品兼容互认证,通过在产品功能.性能.兼容性方面的全面严格测试,得出结论:东 ...

  6. 一文学会powshell使用及功能

    声明! 原文来自微信公众号泷羽Sec-track 认识powsehll PowerShell(通常称作PowerShell或Windows PowerShell)是由微软开发的一种任务自动化和配置管理 ...

  7. PySAGES结合CUDA SPONGE增强采样

    技术背景 在前面的一篇博客中,我们介绍过PySAGES这个增强采样软件的基本安装和使用方法.该软件类似于Plumed是一个外挂增强采样软件,但是PySAGES是基于Python语言和Jax框架来实现的 ...

  8. File and Code template

    /** * @author muzhi.zhong * @author <a href="mailto:muzhi.z@xxx.cn">muzhi.z</a> ...

  9. Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致

    一.前言 在很多软件上,会在某个部位显示一个部件,专门显示当前的CPU使用率以及内存占用,方便用户判断当前程序或者当前环境中是否还有剩余的CPU和内存留给程序使用,在不用打开任务管理器或者资源查看器的 ...

  10. Qt编写的项目作品24-人脸识别综合应用(在线+离线+嵌入式)

    一.功能特点 支持的功能包括人脸识别.人脸比对.人脸搜索.活体检测等. 在线版还支持身份证.驾驶证.行驶证.银行卡等识别. 在线版的协议支持百度.旷视,离线版的支持百度,可定制. 除了支持X86架构, ...