NOIP2013华容道(BFS+乱搞)
n<=30 * m<=30 的地图上,0表示墙壁,1表示可以放箱子的空地。q<=500次询问,每次问:当空地上唯一没有放箱子的空格子在(ex,ey)时,把位于(sx,sy)的箱子移动到(tx,ty)的最小步数。
Solution
一开始听说这道题很难,所以刚拿到题就开始打暴力,emmm。。。
比较。。。。。的思路是记录当前点的位置和空白点的位置,然后暴力转移。
但这个状态十分没有必要,因为我的位置能动的前提是空格在我的当前位置的旁边。
所以我们把状态变成当前点的位置和空白点在当前点的什么方位。
但转移变得困难了,因为我还需要知道从一个点到另一个点不经过某个点的最短距离。
于是就不会了,滚去看TJ。
发现不能经过的点就在当前点的旁边。
所以我们n^2*m^2*4的预处理出这个东西。
但初始状态怎么搞?不能经过的点不在起点旁边啊?
考虑暴力处理这个问题。
发现能过2333
注意判0的情况。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<cmath>
#define R register
#define mm make_pair
using namespace std;
const int dx[]={,,-,};
const int dy[]={,-,,};
struct node{
int x,y,tag;
};
queue<node>q;
queue<pair<int,int> >que;
int a[][],ex,ey,sx,sy,tx,ty,n,m,qu,dis[][][],ans,mi[][][][][],ji[],di[][];
bool vis[][][],visi[][];
inline int rd(){
int x=;char c=getchar();while(!isdigit(c))c=getchar();
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return x;
}
inline void BFS(int ii,int jj,int x2,int y2,int tag){
que.push(mm(ii,jj));
mi[ii][jj][tag][ii][jj]=;
while(!que.empty()){
int u1=que.front().first,u2=que.front().second;visi[u1][u2]=;que.pop();
for(int i=;i<;++i){
int v1=u1+dx[i],v2=u2+dy[i];
if((v1==x2&&v2==y2)||!a[v1][v2])continue;
if(mi[ii][jj][tag][v1][v2]>mi[ii][jj][tag][u1][u2]+){
mi[ii][jj][tag][v1][v2]=mi[ii][jj][tag][u1][u2]+;
if(!visi[v1][v2]){
visi[v1][v2]=;
que.push(mm(v1,v2));
}
}
}
}
}
inline void BB(int ii,int jj,int x2,int y2){
que.push(mm(ii,jj));
memset(di,0x3f,sizeof(di));
di[ii][jj]=;
while(!que.empty()){
int u1=que.front().first,u2=que.front().second;visi[u1][u2]=;que.pop();
for(int i=;i<;++i){
int v1=u1+dx[i],v2=u2+dy[i];
if((v1==x2&&v2==y2)||!a[v1][v2])continue;
if(di[v1][v2]>di[u1][u2]+){
di[v1][v2]=di[u1][u2]+;
if(!visi[v1][v2]){
visi[v1][v2]=;
que.push(mm(v1,v2));
}
}
}
}
}
int main(){
n=rd();m=rd();qu=rd();ji[]=;ji[]=;ji[]=;ji[]=;
memset(mi,0x3f,sizeof(mi));
for(R int i=;i<=n;++i)for(R int j=;j<=m;++j)a[i][j]=rd();
for(R int i=;i<=n;++i)
for(R int j=;j<=m;++j)
for(R int k=;k<;++k)BFS(i,j,i+dx[k],j+dy[k],k);
while(qu--){
ex=rd();ey=rd();sx=rd();sy=rd();tx=rd();ty=rd();
if(tx==sx&&ty==sy){
printf("0\n");
continue;
}
memset(dis,0x3f,sizeof(dis));
for(int i=;i<;++i){
int xx=sx+dx[i],yy=sy+dy[i];
BB(ex,ey,sx,sy);
if(di[xx][yy]!=0x3f3f3f3f){
q.push(node{sx,sy,i});
dis[sx][sy][i]=di[xx][yy];
}
}
ans=0x7f7f7f7f;
while(!q.empty()){
node u=q.front();q.pop();vis[u.x][u.y][u.tag]=;
if(u.x==tx&&u.y==ty){
ans=min(ans,dis[u.x][u.y][u.tag]);
continue;
}
for(R int i=;i<;++i){
R int xx=u.x+dx[i],yy=u.y+dy[i];
if(!a[xx][yy])continue;
int x=u.x+dx[u.tag],y=u.y+dy[u.tag],z=mi[x][y][ji[u.tag]][xx][yy]+;
if(dis[xx][yy][ji[i]]>dis[u.x][u.y][u.tag]+z){
dis[xx][yy][ji[i]]=dis[u.x][u.y][u.tag]+z;
if(!vis[xx][yy][ji[i]]){
vis[xx][yy][ji[i]]=;
q.push(node{xx,yy,ji[i]});
}
}
}
}
if(ans!=0x7f7f7f7f)printf("%d\n",ans);
else printf("-1\n");
}
return ;
}
NOIP2013华容道(BFS+乱搞)的更多相关文章
- [Luogu1979][NOIP2013]华容道(BFS+SPFA)
考虑从起点到终点的过程,一定是先将空格子移到指定格子旁边,和指定格子交换,再移到下一个指定格子要到的地方,再交换,如此反复. 于是问题分为两个部分: 1.给定两个曼哈顿距离为2的格子求最短路,BFS即 ...
- JZYZOJ1442 [noip2013]华容道 bfs 最短路 剪枝
http://172.20.6.3/Problem_Show.asp?id=1442 想到最短路的简直神了,如果我写我大概只能写一个30分的bfs. 从数据范围可以看出思路是bfs剪枝,但这里的剪枝是 ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- [NOIP2013]华容道 题解(搜索)
[NOIP2013]华容道 [题目描述] 这道题根据小时候玩华容道不靠谱的经验还以为是并查集,果断扑街.考后想想也是,数据这么小一定有他的道理. 首先由于是最小步数,所以BFS没跑了.那么我们大可把这 ...
- BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2269 Solved: 1136 [Submit ...
- 洛谷P2661 信息传递 [NOIP2015] 并查集/乱搞 (待补充!
感觉我好水啊,,,做个noip往年题目还天天只想做最简单的,,,实在太菜辽 然后最水的题目还不会正解整天想着乱搞,,, 虽然也搞出来辽233333 好滴不扯辽赶紧写完去做紫题QAQ 正解:并查集 ...
- BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞
BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞 Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有 ...
- [NOIP2013]华容道 题解
[NOIP2013]华容道 首先是一种比较显然的做法. 整个棋盘,除了起点,终点和空格,其他的方块是等价的. 对于终点,它始终不会变化,如果搜到终点结束搜索即可,所以我们不需要考虑终点. 所以需要考虑 ...
- 洛谷 P3438 - [POI2006]ZAB-Frogs(乱搞/李超线段树)
题面传送门 首先一眼二分答案,我们假设距离 \((i,j)\) 最近的 scarefrog 离它的距离为 \(mn_{i,j}\),那么当我们二分到 \(mid\) 时我们显然只能经过 \(mn_{i ...
随机推荐
- oracle小记:dba_data_files
今天给表空间扩展的时候,使用了dba_data_files进行查询.查阅了网上的资料. 该系统系统中含有以下字段 每个字段的含义如下:
- js-XMLHttpRequest 2级
###1. XMLHttpRquest 2级 1) FormData 现代web应用中频繁使用的一项功能就死表单数据的序列化, XMLHttpRquest 2级为此定义了FormData类型 Fo ...
- array_column函数
<?php $arr = [ [ 'id'=>1, 'name'=>'wang', 'age'=>10 ], [ 'id'=>2, 'name'=>'yong', ...
- Tomcat异常及解决办法——持续更新中
公司项目,开发语言为java,中间件为Tomcat,运行过程中,从Tomcat出现了一些异常,现将异常及解决办法记录如下,仅供参考.(不断在补充中.......) 异常一: 1.日志内容 org.ap ...
- JUnit测试提示Java.lang.Exception: No runnable methods
网上一大堆都说,没写@Test,或者是,导包错误,= =然而我并没有发现我有这个毛病 = =最后终于找到罪魁祸首 Junit版本太低!!! Junit版本太低!!! Junit版本太低!!! = =因 ...
- Django框架导读
1.虚拟环境的安装 2.web应用 C/S B/S 架构 3.http协议介绍 4.状态码 5.原生socket 6.框架演变 7.项目演变 一.虚拟环境安装 什么是虚拟环境? 1.对真实环境的一个 ...
- Linux 的相关操作
切换权限 在linux环境下,用户之前的切换使用 “su - name,若要切换到root下面,则使用sudo su 命令即可. 在linux下安装软件,经常就是装完后不知道装到哪里去了 (201 ...
- python学习笔记(8)--random库的使用
伪随机数:采用梅森旋转算法生成的伪随机序列中元素 使用random库 一.基本随机函数 随机数需要一个种子,依据这个种子通过梅森旋转算法产生固定序列的随机数.seed(a=None) 初始化给定的随 ...
- 日志与python日志组件logging
1. 日志的相关概念: (1)日志的作用: a. 开发人员进行程序调试 b. 开发人员定位程序故障的位置 c. 运维人员观察应用运行是否正常 (2)日志的等级 a. DEBUG 最详细的日志,用于问题 ...
- chrome版本下载
chrome 下载:https://www.chromedownloads.net/chrome64win/ chromedriver下载:http://chromedriver.storage.go ...