NOIP2013华容道 大爆搜
预处理出每个点周围四个点互相到达的最短路,再在整个图上跑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华容道 大爆搜的更多相关文章
- [NOIP2015] 斗地主 大爆搜
考试的时候想了半天,实在是想不到解决的办法,感觉只能暴力..然后暴力也懒得打了,小数据模拟骗30分hhh 然而正解真的是暴力..大爆搜.. 然后我的内心拒绝改这道题(TAT) 不过在wcx大佬的帮助下 ...
- noip 2015 斗地主 大爆搜!!!
反正肯定是大模拟 但是每一个可以出的牌都搜一定不是最优的 考虑最特殊的出牌方案:顺子(单,对,三) 每一种方案再加上暴力贪心打出剩下的牌的步数 #include<cstdio> #incl ...
- [NOIP2009] 靶形数独 骚气的大爆搜
这两天OD留的题是搜索,这个东西,就是历年的NOIP压轴题嘛.做了几道什么斗地主啊啥的,感觉还是这题我还懂点. 这道题的搜(xia)索(da)思路是这样的:预处理出一切能处理的东西. 数独大家都了解吧 ...
- [NOIP2013]华容道 题解(搜索)
[NOIP2013]华容道 [题目描述] 这道题根据小时候玩华容道不靠谱的经验还以为是并查集,果断扑街.考后想想也是,数据这么小一定有他的道理. 首先由于是最小步数,所以BFS没跑了.那么我们大可把这 ...
- POJ 1166 The Clocks (爆搜 || 高斯消元)
题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四 ...
- hdu4536-XCOM Enemy Unknown(爆搜)
XCOM-Enemy Unknown是一款很好玩很经典的策略游戏. 在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择3 ...
- 2015 UESTC 搜索专题E题 吴队长征婚 爆搜
吴队长征婚 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Descri ...
- bzoj1306: [CQOI2009]match循环赛(模拟爆搜)
Input第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分.Output输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表.Sample Input 6 5 6 ...
- NOIP2013 华容道 (棋盘建图+spfa最短路)
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> # ...
随机推荐
- C4 垃圾回收
使用C4垃圾回收器可以有效提升对低延迟有要求的企业级Java应用程序的伸缩性. 到目前为止,stop-the-world式的垃圾回收视为影响Java应用程序伸缩性的一大障碍,而伸缩性又是现代企业级Ja ...
- MySQL 8 新特性之Invisible Indexes
背景 索引是把双刃剑,在提升查询速度的同时会减慢DML的操作.毕竟,索引的维护需要一定的成本.所以,对于索引,要加上该加的,删除无用的.前者是加法,后者是减法.但在实际工作中,大家似乎更热衷于前者,而 ...
- Flask框架之 - 简易静态网站 !
网站截图: Python源代码如下: # coding=utf-8 from flask import Flask,render_template app = Flask(__name__) @app ...
- 提升现代web app中页面性能
提升现代web app的中的页面性能 前言,本文翻译自https://docs.google.com/presentation/d/1hBIb0CshY9DlM1fkxSLXVSW3Srg3CxaxA ...
- android开发过程中遇到的坑
在android的学习过程中,会有很多坑,我会把我遇到的,一一列下来,方便后来者查阅! 1:android-support-v4.jar and android-support-v7-appcompa ...
- QUIC协议的分析,性能测试以及在QQ会员实践
WeTest 导读 你听过HTTPS.HTTP2.0.SPDY,但是这些应用层协议都是基于可靠的传输层协议TCP来实现的.那么,基于高效的UDP协议有没有一种相对可靠的应用层协议呢? Why QUIC ...
- 安装RabbitMQ编译erlang时,checking for c compiler default output file name... configure:error:C compiler cannot create executables See 'config.log' for more details.
checking for c compiler default output file name... configure:error:C compiler cannot create executa ...
- 基于DP的LCS(最长公共子序列)问题
最长公共子序列,即给出两个序列,给出最长的公共序列,例如: 序列1 understand 序列2 underground 最长公共序列undernd,长度为7 一般这类问题很适合使用动态规划,其动态规 ...
- Android 开发TCP协议时,报错NetworkOnMainThreadException
设想是通过Android应用连接PC的TCP服务器,通过点击按钮连接服务器, 最终在点击按钮后报错:networkonmainthreadexception 解决办法: 在MainActivity文件 ...
- Python之路,进程、线程、协程篇
本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...