Luogu P2864 [USACO06JAN]树林The Grove(bfs)
P2864 [USACO06JAN]树林The Grove(bfs)
题面
题目描述
The pasture contains a small, contiguous grove of trees that has no 'holes' in the middle of the it. Bessie wonders: how far is it to walk around that grove and get back to my starting position? She's just sure there is a way to do it by going from her start location to successive locations by walking horizontally, vertically, or diagonally and counting each move as a single step. Just looking at it, she doesn't think you could pass 'through' the grove on a tricky diagonal. Your job is to calculate the minimum number of steps she must take.
Happily, Bessie lives on a simple world where the pasture is represented by a grid with \(R\) rows and \(C\) columns ( \(1 \leq R \leq 50, 1 \leq C \leq 50\) ). Here's a typical example where . is pasture (which Bessie may traverse), X is the grove of trees, * represents Bessie's start and end position, and + marks one shortest path she can walk to circumnavigate the grove (i.e., the answer):
...+...
..+X+..
.+XXX+.
..+XXX+
..+X..+
...+++*
The path shown is not the only possible shortest path; Bessie might have taken a diagonal step from her start position and achieved a similar length solution. Bessie is happy that she's starting 'outside' the grove instead of in a sort of 'harbor' that could complicate finding the best path.
牧场里有一片树林,林子里没有坑.
贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回到起点.她能上下左右走,也能走对角线格子.
牧场被分成 \(R\) 行 \(C\) 列( \(1 \leq R \leq 50,1 \leq C \leq 50\) ).下面是一张样例的地图,其中表示贝茜 可以走的空地,“X”表示树林,表示起点.而贝茜走的最近的路已经特别地用“ + ”表示 出来.
题目保证,最短的路径一定可以找到.
输入输出格式
输入格式:
Line \(1\) : Two space-separated integers: \(R\) and \(C\)
Lines \(2..R+1\) : Line \(i+1\) describes row \(i\) with \(C\) characters (with no spaces between them).
输出格式:
Line \(1\) : The single line contains a single integer which is the smallest number of steps required to circumnavigate the grove.
输入输出样例
输入样例:
6 7
.......
...X...
..XXX..
...XXX.
...X...
......*
输出样例:
13
思路
艹,这题的边界判断! \(LSK\) 你试试这道题。 --zbtrs
换了三种写法,终于把神犇推荐的这道题 \(AC\) 了...
我们直接拿样例做例子:
.......
...X...
..XXX..
...XXX.
...X...
......*
比如说最上面的那一颗树,我们在它上面做一条射线。
.......
----
...X...
..XXX..
...XXX.
...X...
......*
那么绕树林一周的路线一定要经过这条射线。
我们可以用 \(bfs\) 更新所有点到出发点的最短距离,并且特判那条射线,要求不能跨过它:
typedef pair<int,int> PII;//个人代码习惯
#define mp(a,b) make_pair(a,b)//同上
int a[8]={-1,-1,-1,+0,+0,+1,+1,+1};//x的变化
int b[8]={-1,+0,+1,-1,+1,+1,+0,-1};//y的变化
step[sx][sy]=1;
queue<PII>Q;//队列
Q.push(mp(sx,sy));//放入出发点
while(!Q.empty())
{
int x=Q.front().first,y=Q.front().second;Q.pop();//取出队首点
for(int i=0;i<8;i++)//枚举所有情况
{
int dx=x+a[i],dy=y+b[i];//能到达的点
if(step[dx][dy]||!G[dx][dy]) continue;//不能到达的点和已经到过的点
if(y<=ly&&x==lx&&dx==lx-1) continue;//不能从上往下穿过射线
if(y<=ly&&x==lx-1&&dx==lx) continue;//不能从下往上穿过射线
step[dx][dy]=step[x][y]+1;
Q.push(mp(dx,dy));
}
}
然后就顺利 \(AC\) 了。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
#define mp(a,b) make_pair(a,b)
int n,m,sx,sy,lx,ly,ans=INT_MAX,G[55][55],step[55][55];
bool is_line_made;
int a[8]={-1,-1,-1,+0,+0,+1,+1,+1};
int b[8]={-1,+0,+1,-1,+1,+1,+0,-1};
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
char ch;
cin>>ch;
if(ch=='*') G[i][j]=1,sx=i,sy=j;
else if(ch=='.') G[i][j]=1;
else if(!lx) lx=i,ly=j;
}
step[sx][sy]=1;
queue<PII>Q;
Q.push(mp(sx,sy));
while(!Q.empty())
{
int x=Q.front().first,y=Q.front().second;Q.pop();
for(int i=0;i<8;i++)
{
int dx=x+a[i],dy=y+b[i];
if(step[dx][dy]||!G[dx][dy]) continue;
if(y<=ly&&x==lx&&dx==lx-1) continue;
if(y<=ly&&x==lx-1&&dx==lx) continue;
step[dx][dy]=step[x][y]+1;
Q.push(mp(dx,dy));
}
}
for(int i=1;i<=ly;i++)
{
if(step[lx][i]&&step[lx-1][i]&&ans>step[lx][i]+step[lx-1][i]) ans=step[lx][i]+step[lx-1][i];
if(step[lx][i]&&step[lx-1][i+1]&&ans>step[lx][i]+step[lx-1][i+1]) ans=step[lx][i]+step[lx-1][i+1];
if(step[lx][i]&&step[lx-1][i-1]&&ans>step[lx][i]+step[lx-1][i-1]) ans=step[lx][i]+step[lx-1][i-1];
}
printf("%d",ans-1);
return 0;
}
Luogu P2864 [USACO06JAN]树林The Grove(bfs)的更多相关文章
- P2864 [USACO06JAN]树林The Grove
P2864 [USACO06JAN]树林The Grove 神奇的射线法+bfs 裸的bfs很难写....... 那么我们找一个最外围障碍点,向图的外边引一条虚拟射线. 蓝后bfs时经过这条射线奇数次 ...
- [USACO06JAN]树林The Grove
树木(grove)Time Limit: 1Sec Memory Limit: 64 MB[Description]牧场里有一片树林,林子里没有坑.贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回 ...
- luogu题解P1032字串变换--BFS+STL:string骚操作
题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...
- 【POJ3182】The Grove BFS 最短路径周围
意甲冠军:给定一个N*M图.,间'X'代表树木(树木必须汇集到森林,非分离),然后,'.'它代表的空间.'*'它代表的起点.现在它需要从起点.一圈,最后回到起点,所经过最少点数. 题目中给的'+'就是 ...
- poj 3182 The Grove bfs
思路:如果要围绕一圈,必须经过一条竖线上的一点,把竖线左端封住,bfs一次,枚举点,再把竖线右端封住,再bfs回起点. #include <iostream> #include <c ...
- 【luogu P2860 [USACO06JAN]冗余路径Redundant Paths】 题解
题目链接:https://www.luogu.org/problemnew/show/P2860 考虑在无向图上缩点. 运用到边双.桥的知识. 缩点后统计度为1的点. 度为1是有一条路径,度为2是有两 ...
- 【luogu P2863 [USACO06JAN]牛的舞会The Cow Prom】 题解
题目链接:https://www.luogu.org/problemnew/show/P2863 求强连通分量大小>自己单个点的 #include <stack> #include ...
- LuoGu P2863 [USACO06JAN]牛的舞会The Cow Prom
题目传送门 这个题还是个缩点的板子题...... 答案就是size大于1的强连通分量的个数 加一个size来统计就好了 #include <iostream> #include <c ...
- luogu P2860 [USACO06JAN]冗余路径Redundant Paths
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1- ...
随机推荐
- 【AT3611】Tree MST
题目 这个题的输入首先就是一棵树,我们考虑一下点分 我们对于每一个分治重心考虑一下跨过这个分治重心的连边情况 就是把当前分治区域内所有的点向距离分治重心最近的点连边 考虑一下这个算法的正确性,如果我们 ...
- MVC中利用ViewBag传递Json数据时的前端处理方法
用viewBag传递Json字符串到前端时,json字符串中的“会被转义为& quot,前端处理方法为@Html.Raw(Json.Encode(ViewBag.Data)),再用eval() ...
- (转)线程池 ExecutorService 详细介绍以及注意点区别
线程池 ExecutorService 相信java开发都用到,这里做个简单笔记 一 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池 ...
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
- Powerdesigner 生成数据字典
https://www.jianshu.com/p/f491d0d3c503http://blog.csdn.net/adparking/article/details/50402980http:// ...
- IDA*算法——骑士精神
例题 骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者 ...
- 洛谷 P1242 新汉诺塔
原题链接 题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号.将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A.B.C,这个状态称为初始状态. 现在要求找到一种步数最少的移动方案 ...
- 自己编写jquery插件
http://blog.csdn.net/chenxi1025/article/details/52222327 https://www.cnblogs.com/ajianbeyourself/p/5 ...
- ip地址分类和子网掩码学习笔记
关于ip的一些学习心得 ip的概念其实很好理解,也很形象,就像一个门牌号一样,让人困惑的其实不是ip的概念本身,而是在日常计算机网络使用中,碰到很多有特殊意义的ip地址,例如,127.0.0.1,19 ...
- Java常用英语汇总(面试必备)
Java常用英语汇总(面试必备) abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存 ...