题目链接

题目

题目描述

在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态。

输入描述

前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。

接着是一个空行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。

输出描述

一个整数,所需要的最少移动次数。

示例1

输入

1111
0000
1110
0010 1010
0101
1010
0101

输出

4

题解

知识点:BFS,状压。

显然用bfs,将局面压缩进 \(16\) 位的二进制,搜索起始状态到目标状态的最短路径。每次扩展所有棋子上下左右四个方向,不要忘记更改局面状态。

时间复杂度 \(O(?)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>

using namespace std;

const int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int fin;
bool vis[1 << 16];
struct node {
int state, step;
}st; int bfs(node st) {
queue<node> q;
q.push(st);
vis[st.state] = 1;
while (!q.empty()) {
node cur = q.front();
q.pop();
if (cur.state == fin) return cur.step;
for (int i = 0;i < 4;i++) {
for (int j = 0;j < 4;j++) {
if (!((cur.state >> (i * 4 + j)) & 1)) continue;
for (int k = 0;k < 4;k++) {
int xx = i + dir[k][0];
int yy = j + dir[k][1];
int sstate = (cur.state & ~(1 << (i * 4 + j))) | (1 << (xx * 4 + yy));
if (xx < 0 || xx >= 4 || yy < 0 || yy >= 4 || ((cur.state >> (xx * 4 + yy)) & 1) || vis[sstate]) continue;
vis[sstate] = 1;
q.push({ sstate,cur.step + 1 });
}
}
}
}
return -1;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
for (int i = 0;i < 4;i++) {
for (int j = 0;j < 4;j++) {
char c;
cin >> c;
if (c == '1') st.state |= 1 << (i * 4 + j);
}
}
for (int i = 0;i < 4;i++) {
for (int j = 0;j < 4;j++) {
char c;
cin >> c;
if (c == '1') fin |= 1 << (i * 4 + j);
}
}
st.step = 0;
cout << bfs(st) << '\n';
return 0;
}

NC19975 [HAOI2008]移动玩具的更多相关文章

  1. bzoj 1054: [HAOI2008]移动玩具 bfs

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 在 ...

  2. bzoj1054: [HAOI2008]移动玩具

    hash+bfs:要注意特殊情况.(似乎连sort.lower_bound都不用数据小直接判重了... #include<cstdio> #include<cstring> # ...

  3. BZOJ 1054 [HAOI2008]移动玩具

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1388  Solved: 764[Submit][Statu ...

  4. 1054: [HAOI2008]移动玩具

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1272  Solved: 690[Submit][Statu ...

  5. P4289 [HAOI2008]移动玩具(bfs)

    P4289 [HAOI2008]移动玩具 双向bfs+状态压缩+记忆化搜索 双向bfs用于对bfs的优化,每次找到可扩展节点少的一边进行一次bfs,找到的第一个互相接触的点即为最短路径 矩阵范围仅4* ...

  6. 【BZOJ1054】[HAOI2008]移动玩具

    [BZOJ1054][HAOI2008]移动玩具 题面 bzoj 洛谷 题解 太\(sb\)了,不想写了,直接点开洛谷题面单击右边蓝色按钮题解即可

  7. 【BZOJ1054】[HAOI2008]移动玩具 BFS

    [BZOJ1054][HAOI2008]移动玩具 Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个 ...

  8. [BZOJ1054][HAOI2008]移动玩具 bfs+hash

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2432  Solved: 1355[Submit][Stat ...

  9. P4289 【一本通提高篇广搜的优化技巧】[HAOI2008]移动玩具

    [HAOI2008]移动玩具 题目描述 在一个 4 × 4 4\times4 4×4 的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方 ...

  10. 【BZOJ】【1055】【HAOI2008】玩具取名

    区间DP/记忆化搜索 sigh……看了提示才想到是区间DP >_>我果然还是太弱 f[l][r][k]表示L到R这段区间能否合并成K,那么就是枚举拆分方案(从哪里断开)和组合方式(左半合成 ...

随机推荐

  1. APB

    APB Usage APB主要用于寄存器和外设(GPIO\TIMER\UART)的访问 CPU 通过AXI接口发出transaction访问外设,AXI-based interconnect接收到AX ...

  2. 【RTOS】基于RTOS的嵌入式系统看门狗策略

    RTOS - high integrity systems 看门狗策略 Watchdog Strategies for RTOS enabled embedded systems 介绍 看门狗定时器就 ...

  3. JS - this 操作 dom , 添加样式

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  4. EasyNetQ(RabbitMQ)在处理消息时,如果抛出异常,继续不断发送到订阅队列,不断处理(也就是不自动确认消息已到达)

    默认情况下,EasyNetQ的消息处理过程中,如果throw exception,那么,依然是认为消息已经送达,不会再次推送,为了让RabbitMQ再次推送,可以这么实现: public sealed ...

  5. [转帖]Nginx动静分离;资源分离;rewrite重写、跳转、伪静态、规则、日志

    https://www.cnblogs.com/caodan01/p/14745562.html 一.动静分离 动静分离,通过中间件将动静请求和静态请求进行分离: 通过中间件将动态请求和静态请求分离, ...

  6. [转帖]grafana配置邮件发送

    grafana的邮件配置文件是/etc/grafana/grafana.ini,新建grafana.ini文件,内容如下. chown 472:472 grafana.ini ############ ...

  7. vim 复制代码的方法

    之前vim 复制代码 总是格式变错乱了 尤其是yaml文件 有的还带注释 非常痛苦 今天早上查了下 原来处理的方式非常简单  增加一个参数就可以了 方法为 1. vim 打开一个文件 2.输入 :se ...

  8. MYsql备份恢复简单过程

    1. 备份数据库 建完数据库更新完补丁之后进行数据库的备份操作. mysqldump -uroot --databases yourdatabase -p > /home/yourdatabas ...

  9. 一条sql了解MYSQL的架构设计

    1 前言 对于一个服务端开发来说 MYSQL 可能是他使用最熟悉的数据库工具,然而,大部分的Java工程师对MySQL的了解和掌握程度,大致就停留在这么一个阶段:它可以建库.建表.建索引,然后就是对里 ...

  10. echarts饼图中央自定义文字

    var option = { tooltip: { trigger: 'item' }, legend: { top: '5%', left: 'center' }, //中央自定义文字 title: ...