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的附近(附近四格) 然后我们 ...
随机推荐
- Android系统启动流程(三)解析SystemServer进程启动过程
1.Zygote启动SystemServer进程 在上一篇文章中我们讲到在ZygoteInit.java的startSystemServer函数中启动了SyetemServer进程,如下所示. fra ...
- Android View体系(四)从源码解析Scroller
在Android View体系(二)实现View滑动的六种方法这篇文章中我们讲到了用Scroller来实现View的滑动,所以这篇文章我们就不介绍Scroller是如何使用的了,本篇就从源码来分析下S ...
- recovery uncrypt功能解析(bootable/recovery/uncrypt/uncrypt.cpp)
我们通常对一个文件可以直接读写操作,或者普通的分区(没有文件系统)也是一样,直接对/dev/block/boot直接读写,就可以获取里面的数据内容了. 当我们在ota升级的时候,把升级包下载到cach ...
- [Android GMS 认证] keystore/keymaster/Attestation的问题
首先确定写入key,操作如下: 检查 /persist/data/sfs 目录下是否有key文件存在 adb shell ls -la /persist/data/sfs 做过key prov ...
- JavaScript大杂烩1 - 理解JavaScript的类型系统
随着硬件水平的逐渐提高,浏览器的处理能力越来越强大,本人坚信,客户端会越来越瘦,瘦到只用浏览器就够了,服务端会越来越丰满:虽然很多大型的程序,比如3D软件,客户端仍然会存在,但是未来的主流必将是浏览器 ...
- 利用StopWatch类监控Java代码执行时间并分析性能
springframework中的StopWatch类可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.一般用来测量代码执行所用的时间或者计算性能数据,在优化代码性能上可以使用Sto ...
- 06-OpenLDAP密码策略
阅读视图 openldap密码策略 OpenLDAP服务端定制密码策略 客户端策划策略实例 定义用户第一次登录就修改密码 问题排查手册 重点推荐官方文档 备注:本文依然承接系列文. 1. openld ...
- 第五章 绘图基础(ALTWIND)
线上箭头表示画线的方向.WINDING模式和ALTERNATE模式都会填充三个封闭的L型区域,号码从1到3.两个更小的内部区域,号码为4和5,在ALTERNATE模式下不被填充.但是在WINDING模 ...
- oracle数据库用户基本操作
每个数据库都有一系列的用户,为了访问数据库,用户必须使用用户名等信息先连接上数据库实例,oracle数据库提供了多种方式来管理用户安全.创建用户的时候,可以通过授权等操作来限制用户能访问的资源以及一些 ...
- Mac OS X 下优化 Terminal,一篇就够了!
先上最终效果图: 目录 目录 1. 相关工具介绍 2. 配置总览 3. 安装步骤 3.1. 安装 iTerm2 3.2. 安装XCode's Command line tools 3.3. 检查 zs ...