考虑从起点到终点的过程,一定是先将空格子移到指定格子旁边,和指定格子交换,再移到下一个指定格子要到的地方,再交换,如此反复。

于是问题分为两个部分:

1.给定两个曼哈顿距离为2的格子求最短路,BFS即可。

2.根据1的结果决定从起点到终点的路径,使用SPFA求解。

其中,第一个问题空格子显然不能经过指定格子,BFS过程中需要特判。第二个问题的状态为(x,y,k),表示当前指定格子在(x,y),空格子在它的哪个方向(1<=k<=4)。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=,inf=1e9;
const int dx[]={-,,,},dy[]={,,-,};
bool inq[<<],mp[N][N];
int n,m,Q,ex,ey,sx,sy,tx,ty,d[<<],dis[N][N],cost[<<];
struct P{ int x,y; }q[<<];
struct S{ int x,y,dir; }q2[<<]; int F(int x,int y,int a,int b){ return x<< | y<< | a<< | b; }
int F(int x,int y,int k){ return x<< | y<< | k; } void bfs(int x0,int y0,int x1,int y1){
memset(dis,-,sizeof(dis));
mp[x1][y1]=; int st=,ed=,tot=; q[]=(P){x0,y0}; dis[x0][y0]=;
while (st<ed){
int x=q[++st].x,y=q[st].y;
if (abs(x-x1)+abs(y-y1)==)
if (--tot==) break;
rep(k,,){
int x2=x+dx[k],y2=y+dy[k];
if (mp[x2][y2] && dis[x2][y2]==-)
dis[x2][y2]=dis[x][y]+,q[++ed]=(P){x2,y2};
}
}
mp[x1][y1]=;
} void init(){
rep(i,,n) rep(j,,m) if (mp[i][j])
rep(p,,){
int x1=i+dx[p],y1=j+dy[p];
if (!mp[x1][y1]) continue;
bfs(i,j,x1,y1);
rep(q,,){
int x2=x1+dx[q],y2=y1+dy[q];
if (~dis[x2][y2]) cost[F(x1,y1,p^,q)]=dis[x2][y2]+;
}
}
} int spfa(){
int st=,ed=;
memset(d,0x3f,sizeof(d));
bfs(ex,ey,sx,sy);
rep(k,,){
int x1=sx+dx[k],y1=sy+dy[k];
if (dis[x1][y1]==-) continue;
q2[++ed]=(S){sx,sy,k}; d[F(sx,sy,k)]=dis[x1][y1]; inq[F(sx,sy,k)]=;
}
while (st<ed){
int x=q2[++st].x,y=q2[st].y,dir=q2[st].dir,u=F(x,y,dir); inq[u]=;
rep(k,,){
int x1=x+dx[k],y1=y+dy[k],c=cost[F(x,y,dir,k)],v=F(x1,y1,k^);
if (mp[x1][y1] && c && d[v]>d[u]+c){
d[v]=d[u]+c; if (!inq[v]) q2[++ed]=(S){x1,y1,k^},inq[v]=;
}
}
}
int ans=inf;
rep(k,,) ans=min(ans,d[F(tx,ty,k)]);
return ans==inf ? - : ans;
} int main(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
scanf("%d%d%d",&n,&m,&Q);
rep(i,,n) rep(j,,m) scanf("%d",&mp[i][j]);
init();
while (Q--){
scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
if (sx==tx && sy==ty) { puts(""); continue; }
printf("%d\n",spfa());
}
return ;
}

[Luogu1979][NOIP2013]华容道(BFS+SPFA)的更多相关文章

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

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

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

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

  3. [NOIP2013]华容道 题解

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

  4. LOJ2613 NOIP2013 华容道 【最短路】*

    LOJ2613 NOIP2013 华容道 LINK 这是个好题,具体题意比较麻烦可以直接看LINK中的链接 然后考虑我们可能的移动方式 首先我们需要把白块移动到需要移动块S的附近(附近四格) 然后我们 ...

  5. codevs 3290 华容道(SPFA+bfs)

    codevs 3290华容道 3290 华容道 2013年NOIP全国联赛提高组 时间限制: 1 s  空间限制: 128000 KB 题目描述 Description 小 B 最近迷上了华容道,可是 ...

  6. NOIP2013 提高组day2 3 华容道 BFS

    描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的 ...

  7. NOIP2013 华容道 (棋盘建图+spfa最短路)

    #include <cstdio> #include <algorithm> #include <cstring> #include <queue> # ...

  8. bzoj P1979 华容道【bfs+spfa】

    调死我了-- 首先观察移动方式,需要移动的格子每次移动到相邻格子,一定是先把空白格子挪过去,所以我们得到一种做法,就是bfs预处理出每一个格子的四联通格子之间的空白格子移动距离建边,注意这个移动是不能 ...

  9. NOIP2013华容道(BFS+乱搞)

    n<=30 * m<=30 的地图上,0表示墙壁,1表示可以放箱子的空地.q<=500次询问,每次问:当空地上唯一没有放箱子的空格子在(ex,ey)时,把位于(sx,sy)的箱子移动 ...

随机推荐

  1. 老生常谈-Activity(山东数漫江湖)

    对于activity的七个声生命周期回调,总是被大家翻来覆去的说,甚至说的都有些厌烦了,这部分知识虽然基础但也很重要,谁都不想在面试的时候只说出个一知半解,下面的分析是对阅读<安卓开发艺术探索& ...

  2. 多种方法过Codeforces Round #270的A题(奇偶法、打表法和Miller_Rabin(这个方法才是重点))

    题目链接:http://codeforces.com/contest/472/problem/A 题目: 题意:哥德巴赫猜想是:一个大于2的素数一定可以表示为两个素数的和.此题则是将其修改为:一个大于 ...

  3. MongoDB 数据库(1)

    数据库 MongoDB (芒果数据库) 数据存储阶段 文件管理阶段 (.txt .doc .xls) 优点 : 数据可以长期保存 可以存储大量的数据 使用简单 缺点 : 数据一致性差 数据查找修改不方 ...

  4. margin 居中

    左右auto加个宽度.margin-left: auto; margin-right: auto; width:640px;

  5. 【HNOI】 攻城略池 tree-dp

    [题目大意] 给定一棵树,边有边权,每个节点有一些兵,现在叶子节点在0时刻被占领,并且任意节点在x被占领,那么从x+1开始,每单位时间产生一个兵,兵会顺着父亲节点一直走到根(1),其中每经过一个节点, ...

  6. 科猫网项目总结(基于SSM框架)

    1.配置文件的添加 SSM整合需要web.xml配置文件,springmvc的配置文件,spring和mybatis整合的配置文件. 1.web.xml文件的配置 1.在WEB-INF下新建web.x ...

  7. IE浏览器Bug总结

    每每在网上搜索IE浏览器Bug时,总是骂声一片,特别是前端工程师,每天都要面对,IE浏览器特别是IE6,存在很多Bug,对Web标准的支持也拖后腿,但不可否认,IE浏览器是曾经的霸主,它的贡献也是巨大 ...

  8. Python 用ctypes观察Python对象的内存结构 -- (转)

    !!!强烈推荐的好文章!!! 对象的两个基本属性 Python所有对象结构体中的头两个字段都是相同的: refcnt:对象的引用次数,若引用次数为0则表示此对象可以被垃圾回收了. typeid:指向描 ...

  9. hdu 1233 还是畅通工程 (最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    ...

  10. spring cloud config 详解

    Spring Cloud 为开发人员提供了一系列的工具来快速构建分布式系统的通用模型 .例如:配置管理.服务发现.断路由.智能路由.微代理.控制总线.一次性Token.全局锁.决策竞选.分布式sess ...