一些废话

夜深人静的夜晚,我开了这道题。看起来,完成它是一件轻而易举的事。我想了想,打开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. .NET Core 异步(Async)底层原理浅谈

    简介 多线程与异步是两个完全不同的概念,常常有人混淆. 异步 异步适用于"IO密集型"的场景,它可以避免因为线程等待IO形成的线程饥饿,从而造成程序吞吐量的降低. 其本质是:让线程 ...

  2. Vue.js 插件

    1.前言 vue的插件其实通过操作Vue这个对象,为其扩展新的功能.例如: // 1. 添加全局方法或 property Vue.myGlobalMethod = function () { // 逻 ...

  3. 初识RPA以及简单的RPA项目——微信群发机器人

    一.RPA的认识和理解 RPA(Robotic Process Automation)即是机器人流程自动化,简称RPA,是一种自动化技术,可以帮助组织实现业务流程的自动化执行,提高效率和准确性.按我的 ...

  4. 切换Docker本地目录

    背景: df -h,发现docker默认的路径在/var/lib下,而且容量即将满掉. 对于欧拉系统来说,目录在/home,需要把docker目前的目录切换到/home下. 解决方法: 1. Dock ...

  5. Proxmox VE(虚拟机集群)安装配置

    #Proxmox VE 安装配置 创建kvm模板 有私有云需求, 创建与管理Windows和Linux虚拟机的场景,使用PVE(Proxmox VE)管理很方便. 本人使用PVE管理公司开发测试环境几 ...

  6. Java线程 interrupt 方法使用异常

    背景 需要在异步任务中中断任务的执行,故选择通过调用 interrupt 方法对线程设置中断信号. 在比较耗时的业务代码增加判断 Thread.currentThread().isInterrupte ...

  7. SpringSecurity认证流程分析

    重要组件 SecurityContext 上下文对象,Authentication(认证)对象会放在里面 SecurityContextHolder 用于拿到上下文对象的静态工具类 Authentic ...

  8. 【C#】【平时练习】将左边列表框(List)的内容(月份)添加到右边列表框。最终右侧显示的内容(月份)要保持一定顺序

    Aspx - 点击查看代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" ...

  9. 【C#】【平时作业】习题-5-类的基础知识

    一.概念题 1. 举例说明什么是类,什么是对象,并说明类与对象的关系? 类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类. 对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还 ...

  10. preparation

    课程知识准备 HTML5基础教程 CSS3基础教程 JavaScript基础教程 HTML DOM基础教程 VUE3基础教程 Element Plus OpenLayers vue3-openlaye ...