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/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
随机推荐
- 1654 方程的解 - Wikioi
题目描述 Description佳佳碰到了一个难题,请你来帮忙解决.对于不定方程a1+a2+… +ak-1 +ak=g(x),其中k≥2且k ∈ N*,x是正整数,g(x) =xx mod 1000( ...
- 3044 矩形面积求并 - Wikioi
题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...
- smarty中的母板极制_extends和block标签
模板继承 继承是从面向对象编程而来的概念,模板继承可以让你定义一个或多个父模板,提供给子模板来进行扩展. 扩展继承意味着子模板可以覆盖部分或全部父模板的块区域. 继承结构可以是多层次的,所以你可以继承 ...
- 使用XAMPP本地安装Wordpress博客
最近一直在研究博客,也知道了大名鼎鼎的wordpress,因此也希望动手尝试一下,看看跟网站提供的博客有何区别. 第一个问题:能什么安装wordPress,能否用tocmat? 虽然问题很可笑,但是之 ...
- LINQ基础
以下为<C#图解教程>读书笔记 LINQ是 直接嵌入C#的强类型查询语言 与LINQ相关的特性: 隐式类型的本地变量:使用var 对象/集合初始化语法:对象初始化语句/对象初始化器/对象初 ...
- 在线最优化求解(Online Optimization)之四:RDA
在线最优化求解(Online Optimization)之四:RDA 不论怎样,简单截断.TG.FOBOS都还是建立在SGD的基础之上的,属于梯度下降类型的方法,这类型方法的优点就是精度比较高,并且T ...
- int a[5]={1,2,3,4,5}; int *p=(int*)(&a+1); printf("%d",*(p-1)); 答案为什么是5?
这个问题的关键是理解 &a a是一个数组名,也就是数组的首地址.对a进行取地址运算符,得到的是一个指向数组的指针!!!!这句话尤为重要!也就相当于int (*p) [5] = &a;p ...
- 在mac上安装hadoop伪分布式
换了macbook pro之后,要重新安装hadoop,但是mac上的jdk跟windows上的不同,导致折腾了挺久的,现在分享出来,希望对大家有用. 一:下载jdk 选择最新版本下载,地址:http ...
- grunt下cssmin的配置参数
每个目标的具体设置,需要参考该模板的文档minify目标的参数具体含义如下: expand:如果设为true,就表示下面文件名的占位符(即*号)都要扩展成具体的文件名. cwd:需要处理的文件(inp ...
- Test Markdown Editor
Last night, I just saw a cute blogger's homepage. Then I want to write something. But anyway, I use ...