P2730 [USACO3.2] 魔板 Magic Squares 题解
一些废话
夜深人静的夜晚,我开了这道题。看起来,完成它是一件轻而易举的事。我想了想,打开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.4 例 2」[USACO3.2]魔板 Magic Squares
[USACO3.2]魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题 ...
- [USACO3.2]魔板 Magic Squares
松下问童子,言师采药去. 只在此山中,云深不知处.--贾岛 题目:魔板 Magic Squares 网址:https://www.luogu.com.cn/problem/P2730 这是一张有8个大 ...
- 洛谷 P2730 魔板 Magic Squares 解题报告
P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...
- 哈希+Bfs【P2730】 魔板 Magic Squares
没看过题的童鞋请去看一下题-->P2730 魔板 Magic Squares 不了解康托展开的请来这里-->我这里 至于这题为什么可以用康托展开?(瞎说时间到. 因为只有8个数字,且只有1 ...
- 【简●解】 LG P2730 【魔板 Magic Squares】
LG P2730 [魔板 Magic Squares] [题目背景] 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 ...
- 洛谷 P2730 魔板 Magic Squares
P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...
- [洛谷P2730] 魔板 Magic Squares
洛谷题目链接:魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都 ...
- P2730 魔板 Magic Squares
题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...
- 洛谷P2730 [IOI]魔板 Magic Squares
题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...
- 魔板 Magic Squares(广搜,状态转化)
题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...
随机推荐
- 斐波那契数列(Java实现)
斐波那契数列 题目描述: 悲波那契数列(Fibonacci sequence)又称黄金分割数列,因数学家莱昂纳多·裴波那契(LeonardodaFibonacci)以兔子繁殖为例子而引入,故又称为&q ...
- DBeaver 不错大家都来用 DBeaver 吧
支持 windows linux 支持 pg 等 n 多数据库
- win10 ocx控件注册失败的解决办法
首先注意:ocx放在大部分系统目录无法注册,比如program file ,但windows目录可以. 第一步:关闭防火墙 第二步:确定是否缺少控件运行需要的微软运行库或其他运行环境 这里提供一个挺全 ...
- 如何调整Gitlab-Runner最大并发数?
概述: 我们在使用gitlab-runner做cicd时,如果安装之后没有配置gitlab-runner的最大并发数,在使用时候可能会碰到job的警告(job日志超过字节限制):job's log e ...
- 长连接网关技术专题(五):喜马拉雅自研亿级API网关技术实践
本文由喜马拉雅技术团队原创分享,原题<喜马拉雅自研网关架构实践>,有改动. 1.引言 网关是一个比较成熟的产品,基本上各大互联网公司都会有网关这个中间件,来解决一些公有业务的上浮,而且能快 ...
- 即时通讯安全篇(十一):IM聊天系统安全手段之传输内容端到端加密技术
本文由融云技术团队分享,原题"互联网通信安全之端到端加密技术",内容有较多修订和改动. 1.引言 在上篇<IM聊天系统安全手段之通信连接层加密技术>中,分享了关于通信连 ...
- Yano 的 2024 观影总结
前言 2024 年马上就要过去了,总结下自己在 2024 年看过的影视作品. PS:我是用 Cursor 写的,所有有一些文字可能是 Cursor 自动补全的,不是我写的 0_o 电影 <怪物& ...
- 【狂神说Java】Java零基础学习笔记-JavaSE总结
[狂神说Java]Java零基础学习笔记-JavaSE总结 JavaSE总结: -完结-撒花- [[狂神说Java]Java零基础学习视频通俗易懂]https://www.bilibili.com/v ...
- [.NET] API网关选择:YARP还是Ocelot?
API网关选择:YARP还是Ocelot? 摘要 随着微服务架构的流行,API网关在系统架构中扮演着越来越重要的角色.在.NET生态中,YARP(Yet Another Reverse Proxy)和 ...
- atomic 包底层实现原理
一.概念介绍(一)volatile关键字 Java 因为指令重排序,优化我们的代码,让程序运行更快,也随之带来了多线程下,指令执行顺序的不可控. 1.volatile关键字的作用: 内存可见性,修饰的 ...