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+乱搞)的更多相关文章

  1. [Luogu1979][NOIP2013]华容道(BFS+SPFA)

    考虑从起点到终点的过程,一定是先将空格子移到指定格子旁边,和指定格子交换,再移到下一个指定格子要到的地方,再交换,如此反复. 于是问题分为两个部分: 1.给定两个曼哈顿距离为2的格子求最短路,BFS即 ...

  2. JZYZOJ1442 [noip2013]华容道 bfs 最短路 剪枝

    http://172.20.6.3/Problem_Show.asp?id=1442 想到最短路的简直神了,如果我写我大概只能写一个30分的bfs. 从数据范围可以看出思路是bfs剪枝,但这里的剪枝是 ...

  3. “盛大游戏杯”第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 描述 在一个矩形的灰度图像上,每个 ...

  4. [NOIP2013]华容道 题解(搜索)

    [NOIP2013]华容道 [题目描述] 这道题根据小时候玩华容道不靠谱的经验还以为是并查集,果断扑街.考后想想也是,数据这么小一定有他的道理. 首先由于是最小步数,所以BFS没跑了.那么我们大可把这 ...

  5. BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2269 Solved: 1136 [Submit ...

  6. 洛谷P2661 信息传递 [NOIP2015] 并查集/乱搞 (待补充!

    感觉我好水啊,,,做个noip往年题目还天天只想做最简单的,,,实在太菜辽 然后最水的题目还不会正解整天想着乱搞,,,  虽然也搞出来辽233333 好滴不扯辽赶紧写完去做紫题QAQ 正解:并查集  ...

  7. BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞

    BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞 Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有 ...

  8. [NOIP2013]华容道 题解

    [NOIP2013]华容道 首先是一种比较显然的做法. 整个棋盘,除了起点,终点和空格,其他的方块是等价的. 对于终点,它始终不会变化,如果搜到终点结束搜索即可,所以我们不需要考虑终点. 所以需要考虑 ...

  9. 洛谷 P3438 - [POI2006]ZAB-Frogs(乱搞/李超线段树)

    题面传送门 首先一眼二分答案,我们假设距离 \((i,j)\) 最近的 scarefrog 离它的距离为 \(mn_{i,j}\),那么当我们二分到 \(mid\) 时我们显然只能经过 \(mn_{i ...

随机推荐

  1. oracle创建表空间、创建用户、授权角色和导入导出用户数据

    使用数据库管理员身份登录 -- log as sysdba sqlplus / as sysdba; 创建临时表空间 -- create temporary tablespace create tem ...

  2. 【译】Focused and Diffuse Modes(专注与发散模式)

    Focused and Diffuse Modes ---文章来源:coursera 面对一个问题,当无论如何都想不出办法时,你会怎么做呢?对于僵尸们来说,只需简单地不断用脑袋撞墙即可.然而活生生的大 ...

  3. 剑指offer(15)

    题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 书中的思路: 按照这个思路我们很容易写出以下代码: import java.util.S ...

  4. Django框架导读

    1.虚拟环境的安装 2.web应用 C/S  B/S 架构 3.http协议介绍 4.状态码 5.原生socket 6.框架演变 7.项目演变 一.虚拟环境安装 什么是虚拟环境? 1.对真实环境的一个 ...

  5. Debian下配置防火墙iptables

    debian下iptables输入命令后即时生效,但重启之后配置就会消失,可用iptables-save快速保存配置,因为Debian上iptables是不会保存规则的,然后在开机自动的时候让ipta ...

  6. JDK 12 & JAVA

    JDK 12 & JAVA js style https://github.com/winterbe https://winterbe.com/posts/2018/09/24/java-11 ...

  7. 老男孩python学习自修第六天【pycharm的使用】

    1.在工程右键可选新建文件夹,包盒python文件 文件夹和包的区别在于,包包含一个空的__init__.py文件,而文件夹没有 2.pycharm的断点调试 点击Debug表示进入调试状态 点击Re ...

  8. PDO访问Mysql数据库

    $dsn = 'mysql:host=127.0.0.1;dbname=myblog'; $username = 'root'; $pwd = '; $pdo = new PDO($dsn,$user ...

  9. C# json解析

    json格式数 [{ , , , "ItemCode": "UBAC11211OF-A54", "basicName_bg": " ...

  10. java开发支付宝支付详细流程_demo的运行

    首先我要吐槽一下支付宝的开放平台简直就是一个迷宫,赞同的顶一下,下面我把要下载的地址给贴出来要不真不好找: 一.准备工作 1.签名工具下载 https://docs.open.alipay.com/2 ...