题目描述

现在有一片树林,小B很想知道,最少需要多少步能围绕树林走一圈,最后回到起点.他能上下左右走,也能走对角线格子。 土地被分成RR行CC列1≤R≤50,1≤C≤501≤R≤50,1≤C≤50,下面是一张样例的地图,其中“.”表示小B可以走的空地,"X"表示树林,"*”表示起点。而小B走的最近的路己经特别地用“+”表示出来。

.......
...X...
..XXX..
...XXX.
...X...
......*

题目保证,一定有合法解并且有且只有一片树林,树林一定是上下左右联通的。

输入数据

第11行输入RR和CC,接下来RR行CC列表示一张地图。地图中的符号如题干所述。

输出数据

输出最少的步数。

样例输入

6 7
.......
...X...
..XXX..
...XXX.
...X...
......*

样例输出

13

数据范围

对于40%40%的数据,R,C≤12R,C≤12 对于60%60%的数据,R,C≤30R,C≤30 对于100%100%的数据,R,C≤50

题目分析


这是一道搜索题,记忆化即可。

最近好久没更新了,我来更新一发。

#include<bits/stdc++.h>
using namespace std;
bitset<>vis[];
int n,m,a[][],dis[][],ans,sx,sy,ex,ey;
const int dx[]={,,,-,,,-,-}, dy[]={,-,,,,-,,-};
queue<pair<int,int> >q;
inline char gc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}signed main(){freopen("grove.in","r",stdin),freopen("grove.out","w",stdout),cin>>n>>m;
if (n==&&m==) {puts("");return ;}
for (int i=;i<=n;++i){gc();
for (int j=; j<=m; ++j){
char c=gc();
if (c!='X') a[i][j]=;
if(c=='*') sx=i,sy=j;
if(c=='X') ex=i,ey=j;
}}q.push(make_pair(sx,sy)),vis[sx][sy]=;
while(q.size()){int x=q.front().first,y=q.front().second;q.pop();
for (int xx,yy,i=;i<;++i){xx=x+dx[i],yy=y+dy[i];
if (xx&&xx<=n&&yy&&yy<=m&&!vis[xx][yy]&&a[xx][yy]){
if(y<=ey&&(x==ex&&xx==ex-||x==ex-&&xx==ex)) continue;
dis[xx][yy]=dis[x][y]+,vis[xx][yy]=,q.push(make_pair(xx,yy));
}}}ans=;
for (int i=;i<=ey;++i)if(a[ex][i]){
if(a[ex-][i]) ans=min(ans,dis[ex][i]+dis[ex-][i]);
if(i+<=m&&a[ex-][i+]) ans=min(ans,dis[ex][i]+dis[ex-][i+]);
if(i>=&&a[ex-][i-]) ans=min(ans,dis[ex][i]+dis[ex-][i-]);
}printf("%d",++ans);
}

【Noip模拟 20160929】树林的更多相关文章

  1. 【Noip模拟 20160929】选数

    题目描述 现在有一排共N个数,你需要从中选出恰好K个.选出K个数后,计算它们两两差值的绝对值的最小值S.你需要确定选出哪K个,才能最大化这个S. 输入数据 输入第一行两个正整数N.K,含义如上. 输入 ...

  2. 【Noip模拟 20160929】花坛迷宫

    题目描述 圣玛格丽特学园的一角有一个巨大.如迷宫般的花坛.大约有一个人这么高的大型花坛,做成迷宫的形状,深受中世纪贵族的喜爱.维多利加的小屋就坐落在这迷宫花坛的深处.某一天早晨,久城同学要穿过这巨大的 ...

  3. 【Noip模拟 20160929】划区灌溉

    题目描述 约翰的奶牛们发现山脊上的草特别美味.为了维持草的生长,约翰打算安装若干喷灌器. 为简化问题,山脊可以看成一维的数轴,长为L(1≤L≤1,000,000)L(1≤L≤1,000,000),而且 ...

  4. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  5. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  6. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  7. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  8. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  9. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

随机推荐

  1. seajs引入jquery框架问题

    seajs引入jquery框架时出现的问题 原因:由于seajs是遵循cmd规范,而jquery是遵循amd规范,所以在seajs调用jquery框架时,需要将amd转换为cmd 转换方法:jquer ...

  2. Linux命令学习之路——文档连接创建:ln

    使用权限:所有角色 使用方式:ln [ -options ] source target 作用:建立源文件与目标文件之间的连接 注意点: 1.连接分为硬连接和软连接,其中硬连接不能对目录做硬连接,且不 ...

  3. AFN 二次封装

    #import "YQDataManager.h" #import <YYModel/YYModel.h> #pragma mark - 数据model基类 @impl ...

  4. mvn package出现No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK

    配置java环境变量时偷懒,没有定义%JAVA_HOME%,应该先定义这个变量,然后在path中新建%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin

  5. https://blog.csdn.net/doegoo/article/details/50749817

    因为使用DiscuzX3.2进行系统的整合后,因为只是想在原J2EE的系统上增加论坛功能,而且J2EE中已经有一套用户的注册认证的体系,所以不需要在Discuz的系统中去注册以及登录功能,而是通过在J ...

  6. Day 14 三元运算符,列表推导式,内置函数

    三目运算符 ```python# 三目(元)运算符:就是 if...else...语法糖# 前提:简化if...else...结构,且两个分支有且只有一条语句# 注:三元运算符的结果不一定要与条件直接 ...

  7. bootstrap模态框弹框后执行Ajax

    如下: editModal:模态框ID <script> $(document).ready(function() { $('#editModal').on('hidden.bs.moda ...

  8. python运行过程

    程序执行过程 PyCodeObject:PyCodeObject则是Python编译器真正编译成的结果. 当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Pyt ...

  9. Excel技巧--分隔工资条

    要将上图的工资表,做成每行都带标题而且有空行间隔的工资条,可以这么做: 1.表格右侧添加一列数据列:输入1,2,选定,并双击单元格右下角形成一升序数字列: 2.再将该列复制,粘贴到该列末尾: 3.点一 ...

  10. c++11 关于typelist的foreach

    建好一个typelist,其中都是类型信息而已,很重要的一个应用,循环迭代干些事情. 看了下boost的for_each实现,用我自己的typelist,大概代码如下: template<typ ...