codevs 3290 华容道
HAHAHA
BFS+SPFA.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 35
#define maxv 100500
#define maxe 400500
#define inf 100000007
using namespace std;
struct edge
{
int v,w,nxt;
}e[maxe];
int n,m,qq,map[maxn][maxn],dp[maxn][maxn][],step[maxn][maxn][][],tot=,nume=,g[maxv],v[maxn][maxn][];
int dt[maxn][maxn],dx[]={-,,,},dy[]={,,-,},dis[maxv];
int ex,ey,sx,sy,tx,ty,s,t;
bool vis[maxv];
queue <int> q;
void addedge(int u,int v,int w)
{
e[++nume].v=v;
e[nume].w=w;
e[nume].nxt=g[u];
g[u]=nume;
}
void reset1()
{
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
for (int k=;k<=;k++)
for (int l=;l<=;l++)
step[i][j][k][l]=inf;
}
void reset2()
{
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
dt[i][j]=inf;
}
void reset3()
{
fill(dis+,dis+tot+,inf);
memset(vis,false,sizeof(vis));
}
bool judge(int x,int y)
{
if ((x>=) && (x<=n) && (y>=) && (y<=m) && (map[x][y]))
return true;
return false;
}
int bfs(int bx,int by,int tx,int ty)
{
while (!q.empty()) q.pop();
reset2();
q.push(bx);q.push(by);
dt[bx][by]=;
while (!q.empty())
{
int hx=q.front();q.pop();
int hy=q.front();q.pop();
if ((hx==tx) && (hy==ty)) return dt[tx][ty];
for (int i=;i<=;i++)
{
int rx=hx+dx[i],ry=hy+dy[i];
if ((judge(rx,ry) && (dt[rx][ry]>dt[hx][hy]+)))
{
dt[rx][ry]=dt[hx][hy]+;
q.push(rx);q.push(ry);
}
}
}
return inf;
}
void pre_bfs()
{
reset1();
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
if (map[i][j])
{
map[i][j]=;
for (int k=;k<=;k++)
for (int l=;l<=;l++)
{
int ax,ay,bx,by;
ax=i+dx[k];ay=j+dy[k];
bx=i+dx[l];by=j+dy[l];
if (judge(ax,ay) && judge(bx,by))
{
int r=bfs(ax,ay,bx,by);
if (r!=inf)
step[i][j][k][l]=r;
}
}
map[i][j]=;
}
}
}
void pre_build()
{
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
if (judge(i,j))
{
for (int k=;k<=;k++)
for (int l=;l<=;l++)
{
int ax,ay,bx,by;
ax=i+dx[k];ay=j+dy[k];
bx=i+dx[l];by=j+dy[l];
if (judge(ax,ay) && (judge(bx,by)) && (step[i][j][k][l]!=inf))
addedge(v[i][j][k],v[bx][by][l^],step[i][j][k][l]+);
}
}
}
}
void build()
{
s=++tot;t=++tot;
for (int i=;i<=;i++)
{
if (judge(sx+dx[i],sy+dy[i]))
{
map[sx][sy]=;
int r=bfs(ex,ey,sx+dx[i],sy+dy[i]);
map[sx][sy]=;
if (r!=inf)
addedge(s,v[sx][sy][i],r);
}
if (judge(tx+dx[i],ty+dy[i]))
addedge(v[tx][ty][i],t,);
}
map[sx][sy]=;
}
int spfa()
{
if ((sx==tx) && (sy==ty)) return ;
if ((sx==ex) && (sy==ey)) return -;
if ((map[sx][sy]==) || (map[tx][ty]==)) return -;
build();
reset3();
while (!q.empty()) q.pop();
q.push(s);dis[s]=;vis[s]=true;
while (!q.empty())
{
int head=q.front();
q.pop();
for (int i=g[head];i;i=e[i].nxt)
{
int v=e[i].v;
if (dis[v]>dis[head]+e[i].w)
{
dis[v]=dis[head]+e[i].w;
if (!vis[v])
{
vis[v]=true;
q.push(v);
}
}
}
vis[head]=false;
}
if (dis[t]==inf) return -;
else return dis[t];
}
int main()
{
memset(g,,sizeof(g));
scanf("%d%d%d",&n,&m,&qq);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
scanf("%d",&map[i][j]);
for (int k=;k<=;k++)
v[i][j][k]=++tot;
}
pre_bfs();
pre_build();
for (int i=;i<=qq;i++)
{
scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
printf("%d\n",spfa());
}
return ;
}
codevs 3290 华容道的更多相关文章
- codevs 3290 华容道(SPFA+bfs)
codevs 3290华容道 3290 华容道 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 小 B 最近迷上了华容道,可是 ...
- 【CodeVS 3290】【NOIP 2013】华容道
http://codevs.cn/problem/3290/ 据说2013年的noip非常难,但Purpleslz学长还是AK了.能A掉这道题真心orz. 设状态$(i,j,k)$表示目标棋子在$(i ...
- 2013 Noip提高组 Day2
3288积木大赛 正文 题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前 ...
- codevs 3289 花匠
题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
随机推荐
- Codeforces Round #358 (Div. 2) D. Alyona and Strings 字符串dp
题目链接: 题目 D. Alyona and Strings time limit per test2 seconds memory limit per test256 megabytes input ...
- git/github在windows上使用
问题描述: git在Windows上的使用 问题解决: (1)下载安装git http://msysgit.github.io/ 到该网址中下载msgit软件 注: 安装msg ...
- 【BZOJ】【3759】Hungergame饥饿游戏
博弈论/高斯消元 如果没有打开箱子这个操作,那么就是一个很裸的Nim游戏…… 但是有了打开箱子这个操作,就变得蛋疼了T_T 首先我们可以想到一种直接的做法:打开所有箱子,当然如果此时所有a[i]的xo ...
- Leetcode#79 Word Search
原题地址 依次枚举起始点,DFS+回溯 代码: bool dfs(vector<vector<char> > &board, int r, int c, string ...
- MacOS Cocos2d-x-3.2 创建HelloWorld项目
开发环境: Mac OSX 10.9.3 Cocos2d-x-3.2 首先,打开终端cd到目录/cocos2d-x-3.2/tools/cocos2d-console/bin下,运行cocos.py脚 ...
- 腾讯QQ企业邮箱在ruby on rails 框架中的mailer配置
在编写ruby on rails程序时,我们可能会需要用到发送邮件的程序,如果使用gmail进行smtp发送一般问题不大,但很多企业使用的是腾讯QQ企业邮箱.使用该邮箱进行链接时出现各种错误,goog ...
- C++ explict 关键字
关键字explicit可以禁止“单参数构造函数”被用于自动类型转换class Stack{explicit Stack(int size);};没有explicit的话Stack s = 40;能编译 ...
- Web应用中的轻量级消息队列
Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚 ...
- 设置Eclipse智能提示
原地址:http://blog.csdn.net/sz_bdqn/article/details/4956162 今天有点时间,研究了一下MyEclispse的智能感知的功能.刚开始使用它时总是感觉如 ...
- 暑假集训单切赛第一场 CF 266E More Queries to Array(线段树+二项式展开式)
比赛时,第二题就是做的这个,当时果断没仔细考虑,直接用线段树暴力求.结果易想而知,超时了. 比赛后搜了搜题解,恍然大悟. 思路:显然用线段树,但是由于每次查询都会有变,所以不可能存储题目中的式子. ...