【POJ3182】The Grove BFS 最短路径周围
意甲冠军:给定一个N*M图。,间‘X’代表树木(树木必须汇集到森林,非分离),然后,‘.’它代表的空间。‘*’它代表的起点。现在它需要从起点。一圈,最后回到起点,所经过最少点数。
题目中给的‘+’就是当中一种最短路径。
题解:随便找一条经过森林且不经过起点的直线,可证路径一定会穿过这条直线。那么就在这条直线上枚举一个点,做两遍BFS,求其从分别直线两側出发到起点的最短距离。
在这里说一个推断边界的简单方法,就是先给图里每一个点打上标记。详见代码里‘in’数组。in值为0的自然就不再里面,而没有必要推断什么“1<=x&&x<=n&&……”。
好了,贴代码。
- #include <queue>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #define N 55
- #define inf 0x3f3f3f3f
- using namespace std;
- const int dx[8]={-1,-1,-1,0,0,1,1,1};
- const int dy[8]={-1,0,1,-1,1,-1,0,1};
- struct Lux
- {
- int x,y;
- Lux(int a,int b):x(a),y(b){}
- Lux(){}
- };
- char mp[N][N];
- int map[N][N];/*0可行,1森林,2枚举线段,3起点*/
- int n,m,ans=inf;
- int dist[N][N],tx,ty;
- int in[N][N],cnt;
- queue<Lux>q;
- int bfs(int sx,int sy)
- {
- int i,fr,ret;
- int vx,vy;
- for(ret=fr=0;fr<2;fr++)
- {
- memset(dist,0x3f,sizeof(dist));
- while(!q.empty())q.pop();
- for(i=fr*5;i<fr*5+3;i++)
- {
- vx=sx+dx[i];
- vy=sy+dy[i];
- if(in[vx][vy]&&!map[vx][vy])dist[vx][vy]=1,q.push(Lux(vx,vy));
- }
- while(!q.empty())
- {
- Lux U=q.front();q.pop();
- for(i=0;i<8;i++)
- {
- vx=U.x+dx[i];
- vy=U.y+dy[i];
- if(in[vx][vy]&&!map[vx][vy]&&dist[vx][vy]>dist[U.x][U.y]+1)
- {
- dist[vx][vy]=dist[U.x][U.y]+1;
- q.push(Lux(vx,vy));
- }
- }
- }
- ret+=dist[tx][ty];
- }
- return ret;
- }
- int main()
- {
- // freopen("test.in","r",stdin);
- int i,j,x,y;
- scanf("%d%d",&n,&m);
- for(i=1;i<=n;i++)scanf("%s",mp[i]+1);
- for(j=1;j<=m;j++)for(i=1;i<=n;i++)
- {
- in[i][j]=++cnt;
- if(mp[i][j]=='X')
- {
- map[i][j]=1;
- x=i;y=j;
- }
- else if(mp[i][j]=='*')tx=i,ty=j;
- }
- if(tx==x&&ty>y)
- {
- for(i=y;mp[x][i]=='X';i--);
- y=i;
- for(i=y;i;i--)map[x][i]=3;
- for(i=y;i;i--)ans=max(ans,bfs(x,i));
- }
- else
- {
- for(i=y+1;i<=m;i++)map[x][i]=3;
- for(i=y+1;i<=m;i++)ans=min(ans,bfs(x,i));
- }
- printf("%d\n",ans);
- return 0;
- }
版权声明:本文博主原创文章,博客,未经同意不得转载。
【POJ3182】The Grove BFS 最短路径周围的更多相关文章
- Luogu P2864 [USACO06JAN]树林The Grove(bfs)
P2864 [USACO06JAN]树林The Grove(bfs) 题面 题目描述 The pasture contains a small, contiguous grove of trees t ...
- [USACO2006][poj3182]The Grove(巧妙的BFS)
题目:http://poj.org/problem?id=3182 题意:一个棋盘中间有一个联通块,给你一个起点让你从起点开始绕联通块外围一圈并回到起点,求最小步数. 分析: 首先根据数据的范围比较小 ...
- [POJ 3984] 迷宫问题(BFS最短路径的记录和打印问题)
题目链接:http://poj.org/problem?id=3984 宽度优先搜索最短路径的记录和打印问题 #include<iostream> #include<queue> ...
- POJ3182 The Grove[射线法+分层图最短路]
The Grove Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 904 Accepted: 444 Descripti ...
- poj 3182 The Grove bfs
思路:如果要围绕一圈,必须经过一条竖线上的一点,把竖线左端封住,bfs一次,枚举点,再把竖线右端封住,再bfs回起点. #include <iostream> #include <c ...
- 推箱子小游戏《格鲁的实验室》13关 - bfs最短路径
下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路. 游戏的目标是把小黄人推到黄色球,小绿人 ...
- bfs(最短路径)
http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- DFS和BFS
BFS 代码步骤: 1.写出每个点和每个点的邻接点的对应关系 2.方法参数:传一个对应关系和起始点 3.创建一个队列,然后每次都移除第一个,然后把移除的邻接点添加进去,打印取出的第一个,然后循环,一直 ...
- 算法导论—无向图的遍历(BFS+DFS,MATLAB)
华电北风吹 天津大学认知计算与应用重点实验室 最后改动日期:2015/8/22 无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等. 无向图主要包括双方面内容,图的遍历和寻找联通分量. 一.无向图的遍历 ...
随机推荐
- PDF转图片 C# with Adobe API
PDF转图片大概有十几种方式,褒贬不一,我就详细给大家说一下我认为效率最高的方式,使用Adobe官方的SDK 安装acrobat reader 9.0以上即可,勾选如下组件.
- WebApi(三)-属性路由 自定义访问路径
启用属性路由: 1.在WebApiConfig中加入如下代码: //属性路由 config.MapHttpAttributeRoutes();
- Java POI 导出EXCEL经典实现 Java导出Excel
转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...
- em(倍)与px的区别(转载)
在国内网站中,包括三大门户,以及"引领"中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位.只有百度好歹做了个可调的表率.而 在大洋彼岸,几乎所有的主流站点都使 ...
- win32画线考虑去锯齿
整理日: 2015年2月16日 这几天一直在研究win32 SDk下画线去锯齿,之前一直用的QT的画线接口函数,里面有去锯齿的效果,可是突然项目要求不能用QT的只能用win32 SDK下的GDI画线接 ...
- theano中的concolutional_mlp.py学习
(1) evaluate _lenet5中的导入数据部分 # 导入数据集,该函数定义在logistic_sgd中,返回的是一个list datasets = load_data(dataset) # ...
- Codeforces 446-C DZY Loves Fibonacci Numbers 同余 线段树 斐波那契数列
C. DZY Loves Fibonacci Numbers time limit per test 4 seconds memory limit per test 256 megabytes inp ...
- 用POLL的方式,没有跑出结果来,立此存照
咦,这些内容,和我以前看内核时的东东,对应起来了.. SELECT,POLL,EPOLL,非阻塞,异步之类的... 但我没有调出来.回家有空了可以看看,不用再敲打代码啦... #!/usr/bin/e ...
- hibernate异常:Could not determine type for: java.util.Set
根本原因:我实体类中的类型是raw,没法直接实例化的类型.private List<String> rightChoices;private Set<String> multi ...
- 使用Sass和Compass组合写CSS
最近开始在尝试开始使用Sass来写CSS代码,刚开始虽然还是不太习惯用链式的方式写css,不过这是暂时的阶段. 如果你还不了解Sass,可以看之前发表过的文章来了解详情,Sass主要有下面这几种特性( ...