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> # ...
随机推荐
- python简单线程和协程学习
python中对线程的支持的确不够,不过据说python有足够完备的异步网络框架模块,希望日后能学习到,这里就简单的对python中的线程做个总结 threading库可用来在单独的线程中执行任意的p ...
- JAVA_Lock
今天是毕业入职的第一个周末,一直对多线程并发方面的知识比较感兴趣,因为目前我手里的项目并没有涉及到并发方面的知识,所以怕以后遗忘,也便于以后复习和使用,所以总结了一下Lock里面的一些类的方法.具体的 ...
- JAVA程序员面试宝典
程序员面试之葵花宝典 面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题 ...
- JavaScript脚本放在哪里
在HTML body部分中的JavaScripts会在页面加载的时候被执行. 在HTML head部分中的JavaScripts会在被调用的时候才执行. ----------------------- ...
- 通向从容之道——Getting things done读书笔记
一.主要的两个目的: 1. 抓住所有一切需要处理的事情: 2. 训练自己在接受一切"输入信息"的前期作出决定. 二.目前的问题: ...
- Oracle面试过程中常见的二十个问题
1.冷备份和热备份的不同点以及各自的优点 解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份.而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库.热备份的优点在于当备份时, ...
- IBATIS的优缺点
ibatis优缺点总结 .优点 简单: 易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现. 实用: 提供了数据映射功能,提供了对底层数据访问的封装(例如ado.net),提供 ...
- HashMap 深入分析
/** *@author annegu *@date 2009-12-02 */ Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上 ...
- mac port 清理
http://popozhu.github.io/2014/10/27/mac-port-%E6%B8%85%E7%90%86/ 使用 mac port 来安装一些软件,时间久了后(也有两年多),更新 ...
- DevOps之一 Gitlab的安装与配置
gitlab的安装 参考治疗:https://www.gitlab.com.cn/installation/#centos-7 http://www.21yunwei.com/archives/435 ...