作者的正解:

对于100%的数据:行动可以分为两种:

1. 步行,花费一个单位的时间移动到4联通的相邻格子中去.

2. 使用传送门,指定一个方向的墙的前面的一个格子,步行至最近的一个墙的面前,使用传送门传送.花费的时间为到达最近墙面前花费的时间+1.

两种行动相组合即可组成任意行动过程.那BFS求出最近的墙的距离,预处理上下左右的第一面墙前的格子.然后建图用DJ跑最短路即可.复杂度为O(MNlog(NM))。

其实所的很清楚了,只是不知道bfs是个什么玩意……直接$n^3$暴扫就行了呀。倒真的没什么可说的,看代码吧。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define MP(a,b) make_pair(a,b)
#define ma(x,y) memset(x,y,sizeof(x))
#define LL long long
#define INF 1000000
using namespace std;
struct edge
{
int u,v,w,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define w(x) ed[x].w
#define n(x) ed[x].nxt
}ed[];
int first[],num_e;
#define f(x) first[x]
char map[][];
int up[][],un[][];
int le[][],re[][];
int n,m;
int cx,cy,fx,fy;
inline int get(int i,int j){return (i-)*m+j;}
inline pair<int,int> ret(int val){return MP(val/m+,val%m);}
int dis[];
bool v[];
void dist(int st)
{
ma(dis,0x7f);
priority_queue<pair<int,int> >q;
dis[st]=;q.push(MP(,st));
while(!q.empty())
{
int x=q.top().second;q.pop();
if(v[x])continue;v[x]=;
for(int i=f(x);i;i=n(i))
if(dis[x]+w(i)<dis[v(i)])
dis[v(i)]=dis[x]+w(i),
q.push(MP(-dis[v(i)],v(i)));
}
}
inline void add(int u,int v,int w);
signed main()
{
cin>>n>>m;
for(int i=;i<=n;i++)
scanf("%s",map[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(map[i][j]=='C')cx=i,cy=j;
if(map[i][j]=='F')fx=i,fy=j;
if(map[i][j]=='#')
up[i][j]=un[i][j]=le[i][j]=re[i][j]=INF;
else
{
for(int k=i-;k>;k--)//上
if(map[k][j]=='#'){up[i][j]=k+;break;}
for(int k=i+;k<=n;k++)//下
if(map[k][j]=='#'){un[i][j]=k-;break;}
for(int k=j-;k>;k--)//左
if(map[i][k]=='#'){le[i][j]=k+;break;}
for(int k=j+;k<=m;k++)//右
if(map[i][k]=='#'){re[i][j]=k-;break;}
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(map[i][j]!='#')
{
if(map[i-][j]!='#')add(get(i,j),get(i-,j),);//,add(get(i-1,j),get(i,j),1);//上
if(map[i+][j]!='#')add(get(i,j),get(i+,j),);//,add(get(i+1,j),get(i,j),1);//下
if(map[i][j-]!='#')add(get(i,j),get(i,j-),);//,add(get(i,j-1),get(i,j),1);//左
if(map[i][j+]!='#')add(get(i,j),get(i,j+),);//,add(get(i,j+1),get(i,j),1);//右
//上
{
add(get(i,j),get(un[i][j],j),i-up[i][j]+);//下
add(get(i,j),get(i,le[i][j]),i-up[i][j]+);//左
add(get(i,j),get(i,re[i][j]),i-up[i][j]+);//右
}
//下
{
add(get(i,j),get(up[i][j],j),un[i][j]-i+);//上
add(get(i,j),get(i,le[i][j]),un[i][j]-i+);//左
add(get(i,j),get(i,re[i][j]),un[i][j]-i+);//右
}
//左
{
add(get(i,j),get(up[i][j],j),j-le[i][j]+);//上
add(get(i,j),get(un[i][j],j),j-le[i][j]+);//下
add(get(i,j),get(i,re[i][j]),j-le[i][j]+);//右
}
//右
{
add(get(i,j),get(up[i][j],j),re[i][j]-j+);//上
add(get(i,j),get(un[i][j],j),re[i][j]-j+);//下
add(get(i,j),get(i,le[i][j]),re[i][j]-j+);//左
}
}
dist(get(cx,cy));
printf("%d\n",dis[get(fx,fy)]);
}
inline void add(int u,int v,int w)
{
if(u==v)return;
++num_e;
u(num_e)=u;
v(num_e)=v;
w(num_e)=w;
n(num_e)=f(u);
f(u)=num_e;
}

HZOJ 走格子的更多相关文章

  1. 51nod1486 大大走格子

    容斥定理+dp...妈呀#1rp耗尽了难怪最近那么衰... #include<cstdio> #include<cstring> #include<cctype> ...

  2. 1289 大鱼吃小鱼 1305 Pairwise Sum and Divide 1344 走格子 1347 旋转字符串 1381 硬币游戏

    1289 大鱼吃小鱼 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右.游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼.从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右 ...

  3. 51nod 1486 大大走格子(容斥原理)

    1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   有一个h行w列的棋盘,里面有一些格子是不能走的,现在要 ...

  4. 51Nod 1344 走格子

    参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6445381.html 1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: ...

  5. 51Nod 1344 走格子(贪心

    1344 走格子   有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去.机器人有一个初始能量,每个格子对应一个整数A[i],表示这个格子的能量值.如果A[i ...

  6. 【51NOD】1486 大大走格子

    [算法]动态规划+组合数学 [题意]有一个h行w列的棋盘,定义一些格子为不能走的黑点,现在要求从左上角走到右下角的方案数. [题解] 大概能考虑到离散化黑点后,中间的空格子直接用组合数计算. 然后解决 ...

  7. 51nod 1344 走格子【贪心/前缀和】

    1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格 ...

  8. 51Nod 1486 大大走格子 —— 组合数学

    题目链接:https://vjudge.net/problem/51Nod-1486 1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: ...

  9. 51nod1344 走格子

    1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格 ...

随机推荐

  1. eclipse配置mybatis xml文件自动提示

    如果使用eclipse中,再写mybatis的xml文件的时候,没有提示,用“Alt+/”,不能把代码用快捷键敲出来,通过下面这个方法,可以解决. 1.下载一个文件,找一个专门的地方保存,配置自动提示 ...

  2. Redis分布式锁的实现及注意事项

    一.前言 分布式锁一般有三种实现方式: 1. 数据库乐观锁: 2. 基于Redis的分布式锁: 3. 基于ZooKeeper的分布式锁. 本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上 ...

  3. Laravel Homestead: 403 forbidden on nginx, http://homestead.app访问不了

    起因:是因为Homestead.yaml 映射失败,一般是由于没有修改sites导致的, 正确的sites设置,类似于: 而很多人吧folders的配置看成是sites的配置了 解决方法: ①按照正确 ...

  4. web前端学习(三)css学习笔记部分(5)-- CSS动画--页面特效、HTML与CSS3简单页面效果实例

    CSS动画--页面特效部分内容目前仅仅观看了解内容,记录简单笔记,之后工作了进行内容的补充 7.  CSS动画--页面特效 7.1  2D.3D转换 7.1.1  通过CSS3转换,我们能够对元素进行 ...

  5. CentOS8/RHEL8--恢复root用户密码及简易加固GRUB

    CentOS8/RHEL8--简易加固GRUB 今天突然想到放在数据中心的虚拟化平台下的Linux服务器,都是采用默认方式安装的,没有设置太多的安全选项,如果有恶意用户重启服务器后,通过GRUB调整启 ...

  6. Katalon系列二十:读写Excle

    import org.apache.poi.xssf.usermodel.XSSFSheet import org.apache.poi.xssf.usermodel.XSSFWorkbook Fil ...

  7. 第二周<线性回归>

    可行性分析 略 sklearn.linear_model.linear_regression() 一些参数 fit_intercept 布尔型参数,表示是否计算该模型的截距 normalize 布尔型 ...

  8. delete records in table A not in table B

    转)A.B两表,找出ID字段中,存在A表,但是不存在B表的数据.A表总共13w数据,去重后大约3W条数据,B表有2W条数据,且B表的ID字段有索引. 方法一 使用 not in ,容易理解,效率低  ...

  9. layer弹出图片的问题

    转载:https://blog.csdn.net/qq_41815146/article/details/81141088 layer下载地址:http://layer.layui.com/ jQue ...

  10. Docker数据管理-数据卷 data volumes和数据卷容器data volumes containers的使用详解

    此文来源于:https://yq.aliyun.com/ziliao/43471 参考原文件之外,做了些修改. Volume数据卷是Docker的一个重要概念.数据卷是可供一个或多个容器使用的特殊目录 ...