[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规则, ...
随机推荐
- 在 MongoDB 上模拟事务操作来实现支付
我们的产品叫「学海密探」,属于在线教育行业,产品需要有支付功能,然而支付最蛋疼是什么?有人会说是支付宝和微信等支付接口的接入开发!没错,但支付接口的开发算是比较简单的了,我觉得凡是跟钱有关系的操作最重 ...
- ubuntu wifi连接出现Network service discovery disabled的解决办法
修改/etc/default/avahi-daemon,将AVAHI_DAEMON_DETECT_LOCAL从1改为0(关闭avahi) ------------------------------- ...
- Linux学习15_CentOS6.5下netcat工具安装教程
1.下载 下载地址:http://sourceforge.net/projects/netcat/files/netcat/0.7.1/ 下载的是netcat-0.7.1.tar.gz版本 2.拷贝 ...
- 新浪微博 page应用 自适应高度设定 终于找到解决方法
我做的是PAGE应用,无法自适应高度.找了好久解决方法. 用js 设置父窗口 iframe 也不好用,有的浏览器不兼容. 官方上说发是这样的: 应用动态高度自适应 Iframe高度:开发者可以使Ifr ...
- BZOJ 1043 【bzoj1043】[HAOI2008]下落的圆盘 | 暴力么??
题目: 题解: 大概是黄学长的博客 #include<cstdio> #include<algorithm> #include<cstring> #include& ...
- JS设置、获取DOM自定义属性
jQuery方式 // 获取 $('#test').attr('mydata'); // 设置 $('#test').attr('mydata','data-content'); // 移除 $('# ...
- swipe display: none后再显示,加载内容后,滑动失效问题
只需要添加这两个属性即可: observer:true,//修改swiper自己或子元素时,自动初始化swiper observeParents:true//修改swiper的父元素时,自动初始化sw ...
- Iterator pattern 及其在java API中的运用
1.问题: 当我们看到java中的Collection,List,Set,Map等集合类时都可以用Iterator进行遍历元素时,我们是否感到很神奇.我们不禁要问java是如何实现这一目标的.这就是我 ...
- <a></a>的href属性失效
<a href="javascript:void(0);" class="close">关闭</a>
- Topcoder SRM 600 div1题解
日常TC计划正式启动! Easy(250pts): 题目大意:给你一个集合,里面一堆数,初始数为0,给你一个目标数,你可以选择集合中若干个数进行OR操作来得到目标数.问至少删去多少个数,使得你永远无法 ...