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- ...
随机推荐
- jdk11.0.2安装
1.去官网下载合适的jdk 网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.ht ...
- falcon监控指标
mysql监控指标: 流量状态: Bytes_received/s #平均每秒从所有客户端接收到的字节数,单位KB Bytes_sent/s #平均每秒发送给所有客户端的字节数,单位KB
- 分享一个现代的,免费的,简单而有效的编辑器Vis
Vis是一个免费的开源,类似Vi的代码编辑器,它扩展了vi的模态编辑,内置支持使用相同编辑器的基于结构正则表达式的命令语言实现的多个游标/选择.并将其与基于sam结构正则表达式的命令语言相结合. Vi ...
- 日志服务Python消费组实战(二):实时分发数据
场景目标 使用日志服务的Web-tracking.logtail(文件极简).syslog等收集上来的日志经常存在各种各样的格式,我们需要针对特定的日志(例如topic)进行一定的分发到特定的logs ...
- Lock方法是用于数据库的锁机制,
Lock方法是用于数据库的锁机制,如果在查询或者执行操作的时候使用: lock(true); 复制代码 就会自动在生成的SQL语句最后加上 FOR UPDATE或者FOR UPDATE NOWAI ...
- Django简介以及安装
目录 前言 Web框架本质 服务器和应用程序 基于第三方模块实现Web框架 Python三大主流Web框架 django flask tornado Django框架介绍 安装 创建项目 创建App ...
- Python3.6爬虫+Djiago2.0+Mysql --运行djiago环境
1.安装djiago 模块 pip install Django --默认安装最新的 安装完成以后可以python -m pip list 查看模块是否安装 2.创建项目及app 及生成目录 备注 ...
- htaccess apache重定向学习
1.推荐博客:http://www.cnblogs.com/adforce/archive/2012/11/23/2784664.html 2.测试工具:https://htaccess.madewi ...
- Windows的进程间通信
对于任何一个现代的操作系统,进程间通信都是其系统结构的一个重要组成部分.而说到Windows的进程(线程)间通信,那就要看是在什么意义上说了.因为正如"Windows的跨进程操作" ...
- Android基础控件ToggleButton和Switch开关按钮
1.简介 ToggleButton和Switch都是开关按钮,只不过Switch要Android4.0之后才能使用! ToggleButton <!--checked 是否选择--> &l ...