预处理出每个点周围四个点互相到达的最短路,再在整个图上跑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. MongoDB学习笔记(四)

    第四章 Mongodb聚合函数 插入 测试数据 for(var j=1;j<3;j++){ for(var i=1;i<3;i++){ var person={ Name:"ja ...

  2. Dubbo性能调优参数及原理

    本文是针对 Dubbo 协议调用的调优指导,详细说明常用调优参数的作用域及源码. Dubbo调用模型 常用性能调优参数 参数名 作用范围 默认值 说明 备注 threads provider 200 ...

  3. 解决:MySQL 报错:1045 - Access denied for user 'root'@'localhost'(using password YES)

    一.前言 今年疯狂迷上了开源,只要看到好的开源项目,就会不顾一切一股脑扎进去研究,五一期间发现一个很好的关于众筹的开源项目,但不巧,这个项目竟然是 PHP 写的,没学过 PHP,自然对这个开源项目毫无 ...

  4. JVM内存详解-阅读笔记

  5. Axis创建webservice客户端和服务端

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/ ...

  6. linux命令TOP参数load average详解[转]

    我们知道判断一个系统的负载可以使用top,uptime等命令去查看,它分别记录了一分钟.五分钟.以及十五分钟的系统平均负载……我们知道判断一个系统的负载可以使用top,uptime等命令去查看,它分别 ...

  7. python22期第一天(课程总结)

    1.Python介绍: python是一门高级编程语言,涉及领域比较广泛,社区活跃,由一个核心开发团队在维护,相对其他语言,易于学习,可移植性强,可扩展性强,易于维护,有大量的标准库可供使用. 2.P ...

  8. FFmpeg备忘录

    av_dup_packet函数 av_dup_packet会为destruct指针为av_destruct_packet_nofree的AVPacket新建一个缓冲区,将原有的缓冲区数据拷贝至新缓冲区 ...

  9. DELETE_FAILED_INTERNAL_ERROR Error while Installing APK

    真是Android2.3的特殊版本问题,问题原因是android2.3的instant run的测试版安装方式有所特别,解决办法有2: 1.手动adb install 安装包 2.把Instant r ...

  10. css初始化标签属性--源码

    body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, p, blockquote ...