P2864 [USACO06JAN]树林The Grove

神奇的射线法+bfs

裸的bfs很难写.......

那么我们找一个最外围障碍点,向图的外边引一条虚拟射线。

蓝后bfs时经过这条射线奇数次最后又回到起点的,就是满足条件的路径

最后来个bfs+记忆化

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. #define N 55
  7. const int d1[]={-,,,,-,-,,};
  8. const int d2[]={,,-,,-,,-,};
  9. struct data{
  10. int x,y,k;//k:穿过次数
  11. data(){}
  12. data(int A,int B,int C):
  13. x(A),y(B),k(C){}
  14. }; queue <data> h;
  15. int n,m,gx,gy,tx,ty,d[N][N][];
  16. char q[N]; bool a[N][N];
  17. bool across(data f,data t){
  18. if(gx==f.x&&gy>f.y&&gx>t.x) return ;//自下而上穿过
  19. if(gx==t.x&&gy>t.y&&gx>f.x) return ;//自上而下穿过
  20. return ;
  21. }
  22. int main(){
  23. memset(d,,sizeof(d));
  24. scanf("%d%d",&n,&m);
  25. for(int i=;i<=n;++i){
  26. scanf("%s",q+);
  27. for(int j=;j<=m;++j){
  28. if(q[j]=='X'){
  29. a[i][j]=;
  30. if(!gx) gx=i,gy=j;//找一个障碍点,最好是外围的
  31. }else if(q[j]=='*'){
  32. d[tx=i][ty=j][]=;
  33. h.push(data(i,j,));
  34. }
  35. }
  36. }
  37. while(!h.empty()){
  38. data u=h.front(),p; h.pop();
  39. for(int i=;i<;++i){
  40. p=data(u.x+d1[i],u.y+d2[i],u.k);
  41. if(p.x<||p.x>n||p.y<||p.y>m)
  42. continue;
  43. if(a[p.x][p.y]) continue;
  44. if(across(u,p)) p.k^=;
  45. if(d[p.x][p.y][p.k]<=d[u.x][u.y][u.k]+)
  46. continue;
  47. d[p.x][p.y][p.k]=d[u.x][u.y][u.k]+;
  48. h.push(p);
  49. }
  50. }printf("%d",d[tx][ty][]);//穿过奇数次回到起点的
  51. return ;
  52. }

P2864 [USACO06JAN]树林The Grove的更多相关文章

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

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

  2. [USACO06JAN]树林The Grove

    树木(grove)Time Limit: 1Sec Memory Limit: 64 MB[Description]牧场里有一片树林,林子里没有坑.贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回 ...

  3. 【BZOJ-1656】The Grove 树木 BFS + 射线法

    1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 186  Solved: 118[Su ...

  4. bzoj:1656 [Usaco2006 Jan] The Grove 树木

    Description The pasture contains a small, contiguous grove of trees that has no 'holes' in the middl ...

  5. 【Noip模拟 20160929】树林

    题目描述 现在有一片树林,小B很想知道,最少需要多少步能围绕树林走一圈,最后回到起点.他能上下左右走,也能走对角线格子. 土地被分成RR行CC列1≤R≤50,1≤C≤501≤R≤50,1≤C≤50,下 ...

  6. 【BZOJ】1656:[Usaco2006 Jan]The Grove 树木(bfs+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1656 神bfs! 我们知道,我们要绕这个联通的树林一圈. 那么,我们想,怎么才能让我们的bfs绕一个 ...

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

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

  8. poj 3182 The Grove

    The Grove Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 641   Accepted: 297 Descripti ...

  9. Luogu2860 [USACO06JAN]冗余路径Redundant Paths

    Luogu2860 [USACO06JAN]冗余路径Redundant Paths 给定一个连通无向图,求至少加多少条边才能使得原图变为边双连通分量 \(1\leq n\leq5000,\ n-1\l ...

随机推荐

  1. poj3614 Sunscreen【贪心】

    Sunscreen Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11772   Accepted: 4143 Descri ...

  2. POJ 1700 - Crossing River

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13982   Accepted: 5349 Description A gr ...

  3. POJ 1149 - PIGS - [最大流构图]

    Time Limit: 1000MS Memory Limit: 10000K Description Mirko works on a pig farm that consists of M loc ...

  4. 2018/03/15 每日一个Linux命令 之 mv

    Linux mv命令用来为文件或目录改名.或将文件或目录移入其它位置. mv [参数] [要移动/更名的文件] [移动路径/要更改名字] 平常用的很多了,这里就不多讲解了,只介绍两个重要参数就好了 - ...

  5. sql两列相除,保留n位小数

    ), ) from tablename 以上代码意思两列相处,然后保留4位小数.

  6. Android应用之——百度地图最新SDK3.0应用,实现最经常使用的标注覆盖物以及弹出窗覆盖物

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yanglfree/article/details/33333413 一.概述 最新版的百度地图SDK ...

  7. Linear Regression Using Gradient Descent 代码实现

    参考吴恩达<机器学习>, 进行 Octave, Python(Numpy), C++(Eigen) 的原理实现, 同时用 scikit-learn, TensorFlow, dlib 进行 ...

  8. jmeter 正则表达式提取器的使用(提取第一个匹配结果)

    原文地址https://www.cnblogs.com/xueli/p/7405258.html?utm_source=itdadao&utm_medium=referral 正则表达式的用处 ...

  9. 常用软件安装及VS插件工具

    常用开发工具安装 开发环境 Visual Studio 2013 Microsoft SQL Server 2008 源代码管理 Git TortoiseGit GitScc Provider Cru ...

  10. lambda函数和map函数

    lambda函数,简化了函数定义的书写形式,使代码更为简洁,但是使用自定义函数的定义方式更为直观,易理解 g = lambda x:x+1 #上面的lambda表达式相当于下面的自定义函数 def g ...