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. Nginx负载均衡各种配置方式

    Nginx负载均衡 - 小刚qq - 博客园http://www.cnblogs.com/xiaogangqq123/archive/2011/03/04/1971002.html Module ng ...

  2. swagger 指定字段不显示到文档里

    Swagger UI 隐藏指定接口类或方法 - 宁静致远 - CSDN博客https://blog.csdn.net/lqh4188/article/details/53538201 swagger ...

  3. 重构客户注册-基于ActiveMQ实现短信验证码生产者

    重构目标:将bos_fore项目中的CustomerAction作为短信消息生产者,将消息发给ActiveMQ,创建一个单独的SMS项目,作为短信息的消费者,从ActiveMQ获取短信消息,调用第三方 ...

  4. day 7-18 mysql case when语句

    概述: sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中, ...

  5. js中获取当前项目名等

    实际上通过window.location可以获取很多跟资源路径相关的信息,需要用到的时候直接通过浏览器调试可以查看window.location的一些属性

  6. python之路--前端CSS

    一.CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义了如何显示HTML元素,给HTML设置样式,让他更加美观. 当浏览器读到这个样式表, 他就会按照这个样式来对文档进行 ...

  7. xadmin快速搭建后台管理系统

    一.xadmin的特点: 1.基于Bootstrap3:Xadmin使用Bootstrap3.0框架精心打造.基于Bootstrap3,Xadmin天生就支持在多种屏幕上无缝浏览,并完全支持Boots ...

  8. 运维常用mysql语句

    1..select @@version; ##查询当前mysql的版本. 2. show variables like 'port';##查看mysql实例的端口. 3.show variables ...

  9. JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁,

    如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度) 在并发编程中,经常遇到多个线程访问同一个 ...

  10. 用 Python分析朋友圈好友的签名

    需要用到的第三方库: numpy:本例结合wordcloud使用 jieba:对中文惊进行分词 PIL: 对图像进行处理(本例与wordcloud结合使用) snowlp:对文本信息进行情感判断 wo ...