[JZOJ3106]锻炼
题目大意:
给你一个$n\times m(n,m\leq 50)$的网格图,其中有一个四连通的障碍物。给定起点和终点,每次你可以走到和当前位置八连通的一个方格内,问绕障碍物一圈最短要走几格?
思路:
BFS求一下最短路,然后当一个点被访问两次时,把两次的最短路加起来即可。
然而这样显然是错的,因为并不能保证两次的路径刚好把障碍物包住,因此我们还需知道每条路径是从障碍物哪边绕过来的。
一种方法是使用扫描线,当两条路径会合时,从障碍物内一点发射一条扫描线,如果和最短路橡胶的次数时奇数,那么肯定是将障碍物包住了。
这样据说已经能过了,不过还有一种更妙的方法。
可以在BFS最短路时,同时记录这条最短路与扫描线相交的次数的奇偶性。
具体方法是,每次最短路往外扩展一格时,判断一下本次扩展是否经过了扫描线。
最后两条最短路会合时,只需要判断一下两个最短路经过次数加起来是否为奇数,如果是,则说明将障碍物包起来了,更新答案。
#include<queue>
#include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
inline char getblock() {
register char ch;
do {
ch=getchar();
} while(ch!='.'&&ch!='X'&&ch!='*');
return ch;
}
typedef std::pair<int,int> Block;
const int N=;
const int inf=0x7fffffff;
const int dx[]={-,-,-,,,,,},dy[]={-,,,-,,-,,};
Block s;
bool f[N][N];
int n,m,dis[N][N];
std::queue<Block> q;
inline bool check(const Block &u) {
return ~u.first&&u.first<n&&~u.second&&u.second<m&&~dis[u.first][u.second];
}
inline bool calc(const Block &u,const Block &v) {
return (u.first==s.first&&u.second>s.second&&v.first<s.first)||(v.first==s.first&&v.second>s.second&&u.first<s.first);
}
int main() {
n=getint(),m=getint();
for(register int i=;i<n;i++) {
for(register int j=;j<m;j++) {
const char ch=getblock();
if(ch=='*') q.push((Block){i,j});
if(ch=='X') {
s=(Block){i,j};
dis[i][j]=-;
}
if(ch=='.') dis[i][j]=inf;
}
}
int ans=inf;
while(!q.empty()) {
const Block u=q.front();
q.pop();
for(register int i=;i<;i++) {
const Block v=(Block){u.first+dx[i],u.second+dy[i]};
if(!check(v)) continue;
if(dis[v.first][v.second]==inf) {
q.push(v);
dis[v.first][v.second]=dis[u.first][u.second]+;
f[v.first][v.second]=f[u.first][u.second]^calc(u,v);
} else {
if(f[u.first][u.second]^calc(u,v)^f[v.first][v.second]) {
ans=std::min(ans,dis[u.first][u.second]+dis[v.first][v.second]+);
}
}
}
}
printf("%d\n",ans);
return ;
}
[JZOJ3106]锻炼的更多相关文章
- [zz]简单有效,在家就能锻炼!
简单有效,在家就能锻炼!下面这套动作美腿.美臀.瘦腰,一步到位,是全身塑形的必备,不用多练,每组1分钟.只需一把椅子即可,献给没有时间.条件去健身房的健身爱好者们! http://weibo.com/ ...
- [No000033]码农网-如何锻炼出最牛程序员的编码套路
最近,我大量阅读了Steve Yegge的文章.其中有一篇叫"Practicing Programming"(练习编程),写成于2005年,读后令我惊讶不已: 与你所相信的恰恰相反 ...
- 每天2分钟平板支撑Plank,锻炼核心肌群,远离背疼痛
本文已转至 http://www.zhoujingen.cn/blog/2692.html 平板支撑(plank)被公认为训练核心肌群最有效的方法之一,每天坚持做可以让平坦的小腹重见天日.据说目前p ...
- 远离腰痛的好方法——如何锻炼腰背部肌肉?
在我们的骨科门诊中最常见到的就是腰痛患者:引起腰痛的原因很多,也比较复杂,所以就有俗语"病人腰痛.医生头痛"一说.其实,相当大部分的腰痛症状都是跟腰背部后方的肌肉筋膜劳损或者无菌性 ...
- P1023 奶牛的锻炼
P1023 奶牛的锻炼 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 USACO 描述 奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息.若她在第 ...
- 去大公司还是去小公司工作——要进大公司的核心部门(提升视野,锻炼技能),远离没真本事的小公司,要自我驱动 good
去大公司还是小公司工作?这个问题问大多数 IT 人都会选择前者.如果换一个问法,去大公司还是去初创公司(Startup)工作?或许有极小一部分人能改变一下决定 对于 IT 人来说,选择到大公司工作的理 ...
- [TYVJ] P1023 奶牛的锻炼
奶牛的锻炼 背景 Background USACO 描述 Description 奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息.若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加 ...
- HealthKit教程 Swift版:锻炼信息
原文:HealthKit Tutorial with Swift: Workouts 作者:Ernesto García 译者:Mr_cyz ) 欢迎回到我们的HealthKit系列教程! 在我们系列 ...
- SICP-2锻炼.34
[锻炼2.34] 为x给定值,找到一个多项式x的值,它也可以被形式化为累积. 下多项式的值: an*x^n + an-1*x^n-1 + .... + a1*x + a0 採用著名的Horner规则, ...
随机推荐
- React03 移动端跨平台开发
目录 React-day03 RN移动端开发 了解React-Native 了解React-Native工作流程 创建第一个React-Native项目 * 了解React-Native项目及结构 开 ...
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 K: 大整数加法
http://acm.ocrosoft.com/problem.php?cid=1316&pid=10 题目描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200 ...
- 虚机中访问外网;NAT中的POSTROUTING是怎么搞的?
看下docker中是怎么配置的网络 在虚机中访问外网:设定了qemu,在主机上添加路由:sudo iptables -t nat -I POSTROUTING -s 192.168.1.110 -j ...
- 一些需要注意的ts
写了一段时间ts,在从头学习一遍,温故而之新 ts的一些技巧 1.巧用注释 通过/** */形式的注释可以给 TS 类型做标记,编辑器会有更好的提示: /** A cool guy. */ inter ...
- hdu 3717 二分+队列维护
思路:已知当前的总长度和为len,当前的伤害为sum,伤害次数为 num.那么对下一个点的伤害值sum=sum+2*len+num: 这个是通过(x+1)^2展开化简就能得到. #include< ...
- SQL UNPIVOT和PIVOT
/* table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) 完整语法: table_sou ...
- SQL 设置自增,和default
mysql数据库为表中已有的主键字段增加自增属性: ALTER TABLE `category ` MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT ...
- Html5学习进阶四 表单元素和表单属性
HTML5 的新的表单元素: HTML5 拥有若干涉及表单的元素和属性. 本章介绍以下新的表单元素: datalist keygen output 浏览器支持 Input type IE Firefo ...
- 基于Xen实现一种domain0和domainU的应用层数据交互高效机制 - 3
继续 上一篇 的研究,结合 xen4.2.3 的代码分析,发现 xen4.2.3 的应用层工具库 tools 包含一个工具叫 libvchan ,其头文件描述如下: * This is a libra ...
- 【转】Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04
原文链接:http://dblab.xmu.edu.cn/blog/install-hadoop/ 当开始着手实践 Hadoop 时,安装 Hadoop 往往会成为新手的一道门槛.尽管安装其实很简单, ...