意甲冠军:给定一个N*M图。,间‘X’代表树木(树木必须汇集到森林,非分离),然后,‘.’它代表的空间。‘*’它代表的起点。现在它需要从起点。一圈,最后回到起点,所经过最少点数。

题目中给的‘+’就是当中一种最短路径。

题解:随便找一条经过森林且不经过起点的直线,可证路径一定会穿过这条直线。那么就在这条直线上枚举一个点,做两遍BFS,求其从分别直线两側出发到起点的最短距离。

在这里说一个推断边界的简单方法,就是先给图里每一个点打上标记。详见代码里‘in’数组。in值为0的自然就不再里面,而没有必要推断什么“1<=x&&x<=n&&……”。

好了,贴代码。

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define N 55
  6. #define inf 0x3f3f3f3f
  7. using namespace std;
  8. const int dx[8]={-1,-1,-1,0,0,1,1,1};
  9. const int dy[8]={-1,0,1,-1,1,-1,0,1};
  10. struct Lux
  11. {
  12. int x,y;
  13. Lux(int a,int b):x(a),y(b){}
  14. Lux(){}
  15. };
  16. char mp[N][N];
  17. int map[N][N];/*0可行,1森林,2枚举线段,3起点*/
  18. int n,m,ans=inf;
  19. int dist[N][N],tx,ty;
  20.  
  21. int in[N][N],cnt;
  22. queue<Lux>q;
  23. int bfs(int sx,int sy)
  24. {
  25. int i,fr,ret;
  26. int vx,vy;
  27.  
  28. for(ret=fr=0;fr<2;fr++)
  29. {
  30. memset(dist,0x3f,sizeof(dist));
  31. while(!q.empty())q.pop();
  32. for(i=fr*5;i<fr*5+3;i++)
  33. {
  34. vx=sx+dx[i];
  35. vy=sy+dy[i];
  36. if(in[vx][vy]&&!map[vx][vy])dist[vx][vy]=1,q.push(Lux(vx,vy));
  37. }
  38. while(!q.empty())
  39. {
  40. Lux U=q.front();q.pop();
  41. for(i=0;i<8;i++)
  42. {
  43. vx=U.x+dx[i];
  44. vy=U.y+dy[i];
  45. if(in[vx][vy]&&!map[vx][vy]&&dist[vx][vy]>dist[U.x][U.y]+1)
  46. {
  47. dist[vx][vy]=dist[U.x][U.y]+1;
  48. q.push(Lux(vx,vy));
  49. }
  50. }
  51. }
  52. ret+=dist[tx][ty];
  53. }
  54. return ret;
  55. }
  56. int main()
  57. {
  58. // freopen("test.in","r",stdin);
  59. int i,j,x,y;
  60. scanf("%d%d",&n,&m);
  61. for(i=1;i<=n;i++)scanf("%s",mp[i]+1);
  62. for(j=1;j<=m;j++)for(i=1;i<=n;i++)
  63. {
  64. in[i][j]=++cnt;
  65. if(mp[i][j]=='X')
  66. {
  67. map[i][j]=1;
  68. x=i;y=j;
  69. }
  70. else if(mp[i][j]=='*')tx=i,ty=j;
  71. }
  72. if(tx==x&&ty>y)
  73. {
  74. for(i=y;mp[x][i]=='X';i--);
  75. y=i;
  76. for(i=y;i;i--)map[x][i]=3;
  77. for(i=y;i;i--)ans=max(ans,bfs(x,i));
  78. }
  79. else
  80. {
  81. for(i=y+1;i<=m;i++)map[x][i]=3;
  82. for(i=y+1;i<=m;i++)ans=min(ans,bfs(x,i));
  83. }
  84. printf("%d\n",ans);
  85. return 0;
  86. }

版权声明:本文博主原创文章,博客,未经同意不得转载。

【POJ3182】The Grove BFS 最短路径周围的更多相关文章

  1. Luogu P2864 [USACO06JAN]树林The Grove(bfs)

    P2864 [USACO06JAN]树林The Grove(bfs) 题面 题目描述 The pasture contains a small, contiguous grove of trees t ...

  2. [USACO2006][poj3182]The Grove(巧妙的BFS)

    题目:http://poj.org/problem?id=3182 题意:一个棋盘中间有一个联通块,给你一个起点让你从起点开始绕联通块外围一圈并回到起点,求最小步数. 分析: 首先根据数据的范围比较小 ...

  3. [POJ 3984] 迷宫问题(BFS最短路径的记录和打印问题)

    题目链接:http://poj.org/problem?id=3984 宽度优先搜索最短路径的记录和打印问题 #include<iostream> #include<queue> ...

  4. POJ3182 The Grove[射线法+分层图最短路]

    The Grove Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 904   Accepted: 444 Descripti ...

  5. poj 3182 The Grove bfs

    思路:如果要围绕一圈,必须经过一条竖线上的一点,把竖线左端封住,bfs一次,枚举点,再把竖线右端封住,再bfs回起点. #include <iostream> #include <c ...

  6. 推箱子小游戏《格鲁的实验室》13关 - bfs最短路径

    下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路. 游戏的目标是把小黄人推到黄色球,小绿人 ...

  7. bfs(最短路径)

    http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  8. DFS和BFS

    BFS 代码步骤: 1.写出每个点和每个点的邻接点的对应关系 2.方法参数:传一个对应关系和起始点 3.创建一个队列,然后每次都移除第一个,然后把移除的邻接点添加进去,打印取出的第一个,然后循环,一直 ...

  9. 算法导论—无向图的遍历(BFS+DFS,MATLAB)

    华电北风吹 天津大学认知计算与应用重点实验室 最后改动日期:2015/8/22 无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等. 无向图主要包括双方面内容,图的遍历和寻找联通分量. 一.无向图的遍历 ...

随机推荐

  1. PDF转图片 C# with Adobe API

    PDF转图片大概有十几种方式,褒贬不一,我就详细给大家说一下我认为效率最高的方式,使用Adobe官方的SDK 安装acrobat reader 9.0以上即可,勾选如下组件.

  2. WebApi(三)-属性路由 自定义访问路径

    启用属性路由: 1.在WebApiConfig中加入如下代码: //属性路由 config.MapHttpAttributeRoutes();

  3. Java POI 导出EXCEL经典实现 Java导出Excel

    转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...

  4. em(倍)与px的区别(转载)

    在国内网站中,包括三大门户,以及"引领"中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位.只有百度好歹做了个可调的表率.而 在大洋彼岸,几乎所有的主流站点都使 ...

  5. win32画线考虑去锯齿

    整理日: 2015年2月16日 这几天一直在研究win32 SDk下画线去锯齿,之前一直用的QT的画线接口函数,里面有去锯齿的效果,可是突然项目要求不能用QT的只能用win32 SDK下的GDI画线接 ...

  6. theano中的concolutional_mlp.py学习

    (1) evaluate _lenet5中的导入数据部分 # 导入数据集,该函数定义在logistic_sgd中,返回的是一个list datasets = load_data(dataset) # ...

  7. 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 ...

  8. 用POLL的方式,没有跑出结果来,立此存照

    咦,这些内容,和我以前看内核时的东东,对应起来了.. SELECT,POLL,EPOLL,非阻塞,异步之类的... 但我没有调出来.回家有空了可以看看,不用再敲打代码啦... #!/usr/bin/e ...

  9. hibernate异常:Could not determine type for: java.util.Set

    根本原因:我实体类中的类型是raw,没法直接实例化的类型.private List<String> rightChoices;private Set<String> multi ...

  10. 使用Sass和Compass组合写CSS

    最近开始在尝试开始使用Sass来写CSS代码,刚开始虽然还是不太习惯用链式的方式写css,不过这是暂时的阶段. 如果你还不了解Sass,可以看之前发表过的文章来了解详情,Sass主要有下面这几种特性( ...