[USACO06JAN]树林The Grove
树木(grove)
Time Limit: 1Sec Memory Limit: 64 MB
【Description】
牧场里有一片树林,林子里没有坑.
贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回到起点.她能上
下左右走,也能走对角线格子.牧场被分成R 行C 列(1≤R≤50,1≤C≤50).下
面是一张样例的地图,其中“.”表示贝茜可以走的空地, “X”表示树林, “*”
表示起点.而贝茜走的最近的路已经特别地用“+”表示出来.
...+...
..+X+..
.+XXX+.
..+XXX+
..+X..+
...+++*
题目保证,最短的路径一定可以找到.
【Input】
第1 行输入R 和C,接下来R 行C 列表示一张地图.地图中的符号如题
干所述.
【Output】、
输出最少的步数.
【Sample Input】
6 7
.......
...X...
..XXX..
...XXX.
...X...
......*
【Sample Output】
13
题解:
有一种很有意思的做法就是随便找一棵树向下沿出一条线,不能从右向左跨越这条线,如果从左向右跨越这条线的话就记为dis[1][x][y],那么只要是跨过了这条线就形成了一个环啦,最后的答案当然是dis[1][bx][by]
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int INF=1e9;
const int cc[][]={{,},{-,},{,-},{,},{,},{-,-},{-,},{,-}};
int dis[][][],bx,by,r,c,caty,catx;char st[][];
struct hh{int x,y,id;};
void bfs()
{
queue<hh>q;
q.push((hh){bx,by,});
memset(dis,0x7f,sizeof(dis));
dis[][bx][by]=;
while (!q.empty())
{
hh now=q.front(); q.pop();
for (int i=;i<;i++)
{
int xx=now.x+cc[i][],yy=now.y+cc[i][];
if (xx< || yy< || xx>r || yy>c || st[xx][yy]=='X') continue;
if (yy==caty && now.y>caty && now.x>catx) continue;
if (now.y==caty && yy>caty && now.x>catx)
{
if (dis[][xx][yy]>dis[][now.x][now.y]+)
{
dis[][xx][yy]=dis[][now.x][now.y]+;
q.push((hh){xx,yy,});
}
}
else
{
if (dis[now.id][xx][yy]>dis[now.id][now.x][now.y]+)
{
dis[now.id][xx][yy]=dis[now.id][now.x][now.y]+;
q.push((hh){xx,yy,now.id});
}
}
}
}
printf("%d",dis[][bx][by]);
}
int main()
{
int i,j;
scanf("%d%d",&r,&c);
bool vv=;
for (i=;i<=r;i++)
{
scanf("%s",st[i]+);
for (j=;j<=c;j++)
{
if (st[i][j]=='*') bx=i,by=j;
if (st[i][j]=='X' && !vv) vv=,caty=j,catx=i;
}
}
bfs();
}
[USACO06JAN]树林The Grove的更多相关文章
- P2864 [USACO06JAN]树林The Grove
P2864 [USACO06JAN]树林The Grove 神奇的射线法+bfs 裸的bfs很难写....... 那么我们找一个最外围障碍点,向图的外边引一条虚拟射线. 蓝后bfs时经过这条射线奇数次 ...
- Luogu P2864 [USACO06JAN]树林The Grove(bfs)
P2864 [USACO06JAN]树林The Grove(bfs) 题面 题目描述 The pasture contains a small, contiguous grove of trees t ...
- 【BZOJ-1656】The Grove 树木 BFS + 射线法
1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 186 Solved: 118[Su ...
- bzoj:1656 [Usaco2006 Jan] The Grove 树木
Description The pasture contains a small, contiguous grove of trees that has no 'holes' in the middl ...
- 【Noip模拟 20160929】树林
题目描述 现在有一片树林,小B很想知道,最少需要多少步能围绕树林走一圈,最后回到起点.他能上下左右走,也能走对角线格子. 土地被分成RR行CC列1≤R≤50,1≤C≤501≤R≤50,1≤C≤50,下 ...
- 【BZOJ】1656:[Usaco2006 Jan]The Grove 树木(bfs+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1656 神bfs! 我们知道,我们要绕这个联通的树林一圈. 那么,我们想,怎么才能让我们的bfs绕一个 ...
- POJ3182 The Grove[射线法+分层图最短路]
The Grove Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 904 Accepted: 444 Descripti ...
- poj 3182 The Grove
The Grove Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 641 Accepted: 297 Descripti ...
- Luogu2860 [USACO06JAN]冗余路径Redundant Paths
Luogu2860 [USACO06JAN]冗余路径Redundant Paths 给定一个连通无向图,求至少加多少条边才能使得原图变为边双连通分量 \(1\leq n\leq5000,\ n-1\l ...
随机推荐
- C语言:开平方根sqrt程序02
#include <stdio.h> int sqrt01(int x); void main(void){ int x=49,y; y=sqrt01(x); if(y<0) pri ...
- Git 工具 - 储藏(Stashing)
储藏(Stashing) 经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作.问题是,你不想提交进行了一半的工作,否则以后你无法 ...
- Java oop(一些自己的理解,并没有展开很细)
一下内容是自己总结用的,只是按照自己的理解去写.参考的是菜鸟教程.Java 是一个面向对象的语言.OOP就是面向对象编程.封装:在某些类里面,某些属性不想向外暴露,但是我们又想提供一个方法去访问或修改 ...
- Ubuntu 18.04安装VNC远程登录
reference: https://blog.csdn.net/bluewhalerobot/article/details/73649353 https://community.bwbot.org ...
- springboot配置文件(.yml)中自定义属性值并在controller里面获取
1,由于项目需要,学习了新的框架--springboot,顺便练习一下在.yml中配置自定义属性并在controller里面获取.(以下的Springboot框架我已经搭建好,就不在陈述) 2,spr ...
- UML 类图口诀
UML类图口诀: (10G:实线继承)空三角实线指向被继承, (虚实:虚线实现)空三角虚线指向被实现, (恐惧:空棱形聚合)空棱形实线(棱形)指向聚合整体.部分作为成员变量. (十足:实棱形组合)实棱 ...
- 使用VMware 虚拟linux系统环境
操作步骤说明: https://jingyan.baidu.com/album/f71d603782e70e1ab641d1da.html?picindex=1 vmware 克隆多个系统: http ...
- Linux虚拟机部署单机solr报错500解决方法之一
HTTP Status 500 - {msg=SolrCore 'collection1' is not available due to init failure: Could not load c ...
- 禁用ViewPager的滑动事件
public class NoScrollViewPager extends ViewPager { private boolean noScroll = false; public NoScroll ...
- 封装Thread的两种方法 via C++ in Linux
方法一: 代理线程函数(proxyThreadFunc)作为类的静态成员函数, 回调函数指针作为类的私有成员变量 方法二: 代理线程函数(proxyThreadFunc)作为全局函数, 回调函数指针 ...