预处理出每个点周围四个点互相到达的最短路,再在整个图上跑SPFA,要记录路径

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#define N 32
using namespace std;
int dx[]={-,,,},dy[]={,,-,};
int n,m,g[N][N],dis[N][N][][],f[N][N][];
bool bo[N][N],vis[N][N][];
int qx[N*N],qy[N*N],fn[N*N],h,t;
int bfs1(int sx,int sy,int tx,int ty,int xx,int yy){
if(tx==sx&&ty==sy)return ;
memset(bo,,sizeof bo);
qx[]=sx;qy[]=sy;h=t=;bo[sx][sy]=;fn[]=;
bo[xx][yy]=;
while(h<=t){
int nx=qx[h],ny=qy[h++];
for(int i=;i<;i++)
if(g[nx+dx[i]][ny+dy[i]]&&!bo[nx+dx[i]][ny+dy[i]]){
bo[nx+dx[i]][ny+dy[i]]=;
qx[++t]=nx+dx[i];qy[t]=ny+dy[i];
fn[t]=fn[h-]+;
if(nx+dx[i]==tx&&ny+dy[i]==ty)return fn[t];
}
}return dis[][][][];
}
void find(int x,int y){
for(int i=;i<;i++)if(g[x+dx[i]][y+dy[i]]){
dis[x][y][i][i]=;
for(int j=i+;j<;j++)if(g[x+dx[j]][y+dy[j]]){
int d=bfs1(x+dx[i],y+dy[i],x+dx[j],y+dy[j],x,y);
dis[x][y][i][j]=d;
dis[x][y][j][i]=d;
}
}
}
void init(){
memset(dis,0x3f,sizeof dis);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)if(g[i][j])
find(i,j);
} struct data{
int x,y,pos;
}d,ne;
int spfa(int sx,int sy,int tx,int ty){
memset(vis,,sizeof vis);
if(sx==tx&&sy==ty)return ;
queue<data> q; while(!q.empty())q.pop();
for(int i=;i<;i++)if(g[sx+dx[i]][sy+dy[i]]){
vis[sx+dx[i]][sy+dy[i]][i]=;
q.push((data){sx+dx[i],sy+dy[i],i});
}
while(!q.empty()){
d=q.front(); vis[d.x][d.y][d.pos]=; q.pop();
for(int i=;i<;i++){
if(g[d.x+dx[i]][d.y+dy[i]]&&f[d.x+dx[i]][d.y+dy[i]][i]>f[d.x][d.y][d.pos]+dis[d.x][d.y][d.pos^][i]+){
f[d.x+dx[i]][d.y+dy[i]][i]=f[d.x][d.y][d.pos]+dis[d.x][d.y][d.pos^][i]+;
if(!vis[d.x+dx[i]][d.y+dy[i]][i]){
vis[d.x+dx[i]][d.y+dy[i]][i]=;
q.push((data){d.x+dx[i],d.y+dy[i],i});
}
}
}
}
int ans=0x3f3f3f3f;
for(int i=;i<;i++)
ans=min(ans,f[tx][ty][i]);
return ans==0x3f3f3f3f?-:ans;
}
int work(int ex,int ey,int sx,int sy,int tx,int ty){
memset(f,0x3f,sizeof f);
for(int i=;i<;i++)
if(g[sx+dx[i]][sy+dy[i]])
f[sx+dx[i]][sy+dy[i]][i]=bfs1(ex,ey,sx+dx[i],sy+dy[i],sx,sy)+;
return spfa(sx,sy,tx,ty);
} int main(){
int q,ex,ey,sx,sy,tx,ty;
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&g[i][j]);
init();
while(q--){
scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
printf("%d\n",work(ex,ey,sx,sy,tx,ty));
}
return ;
}

Code

NOIP2013华容道 大爆搜的更多相关文章

  1. [NOIP2015] 斗地主 大爆搜

    考试的时候想了半天,实在是想不到解决的办法,感觉只能暴力..然后暴力也懒得打了,小数据模拟骗30分hhh 然而正解真的是暴力..大爆搜.. 然后我的内心拒绝改这道题(TAT) 不过在wcx大佬的帮助下 ...

  2. noip 2015 斗地主 大爆搜!!!

    反正肯定是大模拟 但是每一个可以出的牌都搜一定不是最优的 考虑最特殊的出牌方案:顺子(单,对,三) 每一种方案再加上暴力贪心打出剩下的牌的步数 #include<cstdio> #incl ...

  3. [NOIP2009] 靶形数独 骚气的大爆搜

    这两天OD留的题是搜索,这个东西,就是历年的NOIP压轴题嘛.做了几道什么斗地主啊啥的,感觉还是这题我还懂点. 这道题的搜(xia)索(da)思路是这样的:预处理出一切能处理的东西. 数独大家都了解吧 ...

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

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

  5. POJ 1166 The Clocks (爆搜 || 高斯消元)

    题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四 ...

  6. hdu4536-XCOM Enemy Unknown(爆搜)

    XCOM-Enemy Unknown是一款很好玩很经典的策略游戏. 在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择3 ...

  7. 2015 UESTC 搜索专题E题 吴队长征婚 爆搜

    吴队长征婚 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Descri ...

  8. bzoj1306: [CQOI2009]match循环赛(模拟爆搜)

    Input第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分.Output输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表.Sample Input 6 5 6 ...

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

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

随机推荐

  1. properties类是Hashtable的子类

    properties类是Hashtable的子类 增加了将Hashtable对象中的关键字保存到文件和从文件中读取关键字和值到Hashtable对象中的方法 Properties.store方法存储P ...

  2. AngularJs 学习笔记(四)服务

    模型是指$scope上保存的包含瞬时状态数据的JavaScript对象. 服务是一个单例对象,只会被$injector实例化一次,并且是在需要的时候才会被创建,服务提供了把与特定功能相关联的方法集中在 ...

  3. 【读书笔记】C++Primer---第一章

    1.标准库的头文件用尖括号<>括起来,非标准库的头文件用双引号“”括起来:

  4. JavaScript 中的undefined and null 学习

    JavaScript 中的undefined and null learn record from the definitive guide to html5 JavaScript 中有两个特殊值:u ...

  5. Python实现PPPOE攻击工具

    前言 大家可能对PPPOE不是很熟悉,但是肯定对拨号上网非常熟悉,拨号上网就是用的这种通信协议.一般PPPOE认证上网主要用于校园网或者小区网中,拨号界面如下图所示. 但是PPPOE这种通信协议,是有 ...

  6. Ocelot中文文档-服务发现

    Ocelot允许您指定服务发现提供程序,并使用它来查找Ocelot正在将请求转发给下游服务的主机和端口.目前,这仅在GlobalConfiguration部分中受支持,这意味着所有ReRoute将使用 ...

  7. Heap

    #include using namespace std; int heap[100010],cnt=0; void put(int x) { cnt++; heap[cnt]=x; int now= ...

  8. PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。

    Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...

  9. Solr(六)Solr索引数据存放到HDFS下

    Solr索引数据存放到HDFS下 一 新建solr core hdfs 方法:http://www.cnblogs.com/Matchman/p/7287385.html 二 修改solrconfig ...

  10. python爬虫入门(七)Scrapy框架之Spider类

    Spider类 Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作 ...