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 #303 (Div. 2) E. Paths and Trees 最短路+贪心
题目链接: 题目 E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes inputs ...
- Unity3D脚本中文系列教程(十七)
http://dong2008hong.blog.163.com/blog/static/469688272014032332976/ ◆ Static function PrefixLabel(to ...
- Properties --- C++读配置信息的类(一)
http://blog.csdn.net/billow_zhang/article/details/4304980 在开发实践中,积累了一些通用的C++ 类库,在此写出来给大家分享.也希望能给出更好的 ...
- URAL 1297 Palindrome 最长回文子串
POJ上的,ZOJ上的OJ的最长回文子串数据量太大,用后缀数组的方法非常吃力,所以只能挑个数据量小点的试下,真要做可能还是得用manacher.贴一下代码 两个小错,一个是没弄懂string类的sub ...
- hdu 2065 "红色病毒"问题
指数型母函数的应用 求A B C D 在规定条件下n个元素的排列个数,先写出指数型母函数 G(X) = ( 1 + x + x^2/2! + x^3/3! +... )^2 * ( 1+ x^2/2! ...
- Cache 应用程序数据缓存
System.Web.Caching 命名空间提供用于缓存服务器上常用数据的类.此命名空间包括 Cache 类,该类是一个字典,您可以在其中存储任意数据对象,如哈希表和数据集.它还为这些对象提供了失效 ...
- lintcode :搜索二维矩阵
题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1 ...
- JDK安装配置问题
JDK安装过程中会有两个安装提示,一个是jdk的安装,一个是jre的安装
- apache配置优化
最近参加了很多面试,多多少少有点小感悟,可以说观念转变了不少,特别是对于作为一个开发人员的定位,原来只是认为开发人员就只需要写好代码就行了,所以只需要有数据结构,算法,设计模式,重构方面的知识就行了. ...
- 每用户订阅上的所有者 SID 不存在 (异常来自 HRESULT:0x80040207)
出现这个问题是因为pQueryFilter.WhereClause = "RoomNumber=" +cmbFromPoint.SelectedItem;中的cmbFromPoin ...