Luogu1979 NOIP2013D2T3 华容道 搜索、最短路
题意:给出一个$N \times M$的棋盘,棋盘上有一些块可以移动,有一些块无法移动。$Q$次询问,每一次询问给出三个块$a,b,c$,将$a$块变为空格,空格旁边可移动的块可以与空格交换位置。问每一次询问中最小的将$b$块移动到$c$块最开始位置上的移动次数。$N , M \leq 30 , Q \leq 500$
我觉得我在$NOIP$考场上绝对会直接打暴力qwq
我们能够发现空格必须要在需要移动的格子的四周,而且不移动需要移动的格子,才能发挥效果。所以当空格在需要移动的格子旁边的时候,只有两种情况:①将需要移动的格子与空格交换位置;②将空格移动到需要移动的格子的另一侧。所以我们预处理:$f_{i,j,k,l}$表示将空格从格子$i,j$的方向$k$移动到方向$l$且不移动$(i,j)$的最少步数,可以通过$bfs$实现,复杂度$O(16N^2M^2)$
接下来就是一个类似于最短路的问题了。然而最开始空格与需要移动的格子不相邻,所以我们在每一次询问的时候,再一次$bfs$计算现在空格的位置到达需要移动的格子四周且不移动需要移动的格子的最少移动次数,然后跑$SPFA$即可。因为图很小,卡不了$SPFA$。
#include<bits/stdc++.h>
using namespace std;
inline int read(){
;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c)){
a = (a << ) + (a << ) + (c ^ ');
c = getchar();
}
return a;
}
][] = {,,,,-,,,-};
][][][] , dis[][][] , t[][] , N , M , Q;
][] , inq[][][];
struct be{
int x , y , dir;
}now;
queue < pair < int , int > > q;
queue < be > q1;
inline int SPFA(int aX , int aY , int bX , int bY , int cX , int cY){
while(!q.empty())
q.pop();
if(!canbe[aX][aY] || !canbe[bX][bY])
return 0x3f3f3f3f;
memset(t , 0x3f , sizeof(t));
t[aX][aY] = ;
q.push(make_pair(aX , aY));
while(!q.empty()){
pair < int , int > r = q.front();
q.pop();
if(r.first == bX && r.second == bY)
return t[bX][bY];
; i < ; i++)
] != cX || r.second + dir[i][] != cY)
]][r.second + dir[i][]])
]][r.second + dir[i][]] > t[r.first][r.second] + ){
t[r.first + dir[i][]][r.second + dir[i][]] = t[r.first][r.second] + ;
q.push(make_pair(r.first + dir[i][] , r.second + dir[i][]));
}
}
return 0x3f3f3f3f;
}
inline void bfs(int sX , int sY , int tX , int tY){
; i < ; i++)
if(dis[sX][sY][i] != 0x3f3f3f3f){
inq[sX][sY][i] = ;
q1.push((be){sX , sY , i});
}
while(!q1.empty()){
now = q1.front();
inq[now.x][now.y][now.dir] = ;
q1.pop();
if(now.x == tX && now.y == tY)
continue;
; i < ; i++)
if(now.dir != i){
int N = dis[now.x][now.y][now.dir] + f[now.x][now.y][now.dir][i];
if(dis[now.x][now.y][i] > N){
dis[now.x][now.y][i] = N;
if(!inq[now.x][now.y][i]){
inq[now.x][now.y][i] = ;
q1.push((be){now.x , now.y , i});
}
}
}
]][now.y + dir[now.dir][]][ - now.dir] > dis[now.x][now.y][now.dir] + ){
dis[now.x + dir[now.dir][]][now.y + dir[now.dir][]][ - now.dir] = dis[now.x][now.y][now.dir] + ;
]][now.y + dir[now.dir][]][ - now.dir]){
inq[now.x + dir[now.dir][]][now.y + dir[now.dir][]][ - now.dir] = ;
q1.push((be){now.x + dir[now.dir][] , now.y + dir[now.dir][] , - now.dir});
}
}
}
}
int main(){
N = read();
M = read();
Q = read();
; i <= N ; i++)
; j <= M ; j++)
canbe[i][j] = read();
memset(f , 0x3f , sizeof(f));
; i <= N ; i++)
; j <= M ; j++)
if(canbe[i][j])
; m <= ; m++)
; n <= ; n++)
f[i][j][m][n] = SPFA(i + dir[m][] , j + dir[m][] , i + dir[n][] , j + dir[n][] , i , j);
while(Q--){
int a = read() , b = read() , c = read() , d = read() , e = read() , f = read();
if(c == e && d == f){
printf("0\n");
continue;
}
memset(dis , 0x3f , sizeof(dis));
; i < ; i++)
dis[c][d][i] = SPFA(a , b , c + dir[i][] , d + dir[i][] , c , d);
bfs(c , d , e , f);
int ans = 0x3f3f3f3f;
; i < ; i++)
ans = min(ans , dis[e][f][i]);
printf( : ans);
}
;
}
Luogu1979 NOIP2013D2T3 华容道 搜索、最短路的更多相关文章
- NOIp2013D2T3 华容道【搜索&图论-最短路】
题目传送门 暴力搜索 看到这道题的第一反应就是直接上$bfs$啦,也没有想到什么更加优秀的算法. 然后就是$15$分钟打了$70$分,有点震惊,纯暴力诶,这么多白给分嘛,太划算了,这可是$D2T3$诶 ...
- Remmarguts' Date POJ - 2449 (A*搜索|k短路)
"Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...
- 2018/7/16 YMOI模拟 NOIP2013D2T3华容道
题目描述 Description 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. ...
- [題解]TYVJ_2032(搜索/最短路)
搜索:https://www.cnblogs.com/SiriusRen/p/6532506.html?tdsourcetag=s_pctim_aiomsg 來自 SiriusRen 數據範圍小,考慮 ...
- NOIP 2017 逛公园 记忆化搜索 最短路 好题
题目描述: 策策同学特别喜欢逛公园.公园可以看成一张N个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. ...
- Luogu P1979 华容道(bfs+最短路)
P1979 华容道 题意 题目描述 小B最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成, 最少需要多少时间. ...
- hduoj----1142A Walk Through the Forest(记忆化搜索+最短路)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- HDU 1142 A Walk Through the Forest (记忆化搜索 最短路)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- LOJ2613 NOIP2013 华容道 【最短路】*
LOJ2613 NOIP2013 华容道 LINK 这是个好题,具体题意比较麻烦可以直接看LINK中的链接 然后考虑我们可能的移动方式 首先我们需要把白块移动到需要移动块S的附近(附近四格) 然后我们 ...
随机推荐
- Chrome浏览器跨域
配置新版Chrome浏览器跨域,需要创建用户数据文件夹,在其中保存浏览器的缓存.历史记录.收藏夹等数据. Windows系统Chrome跨域 1 下载Chrome 64位绿色版,解压缩,并在桌面创建快 ...
- SoapUI 利用SoapUI进行简单的接口并发测试
利用SoapUI进行简单的接口并发测试 by:授客 QQ:1033553122 测试环境: SoapUI Pro 5.1.2 步骤如下 1. 把请求添加到测试套件 1.1. 途径1 1.新 ...
- [20180626]函数与标量子查询14.txt
[20180626]函数与标量子查询14.txt --//前面看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查 ...
- python第三十一天-----类的封装、继承,多态.....
封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. cla ...
- 【HANA系列】SAP HANA XS使用Data Services查询CDS实体【一】
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Dat ...
- 使用 PsPing & PaPing 进行 TCP 端口连通性测试
PsPing & PaPing 介绍 通常,我们测试数据包能否通过 IP 协议到达特定主机时,都习惯使用 ping 命令.工作时 ping 向目标主机发送一个 IMCP Echo 请求的数据包 ...
- [Compression] Hadoop 压缩
0. 说明 Hadoop 压缩介绍 && 压缩格式总结 && 压缩编解码器测试 1. 介绍 [文件压缩的好处] 文件压缩的好处如下: 减少存储文件所需要的磁盘空间 加速 ...
- 使用navicat 连接mysql出现1251错误
最近需要用MYSQL,使用navicat 连接时总出现1251错误,在网上查了一些别人的方法并试过 以下方法是正确的. 方法来自:https://blog.csdn.net/XDMFC/article ...
- Linux 小知识翻译 - 「X Window系统」
X Window System是给Unix系的OS提供的一套窗口管理软件或者说是组件.X Window System已经成为了在Linux上使用GUI环境的不可或缺的东西了. X Window Sys ...
- WPFの数据源事件变更通知
如果数据绑定的目标是TextBox元素的Text属性,那么默认会使用双向绑定(Mode.TwoWay),此时用户可以通过更改TextBox元素Text属性的值从而更新源属性信息,但是如果在程序代码中更 ...