【描述】

农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽度W(1<=W<=38)及高度H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数(就是从最“糟糕”的一点,走出迷宫的最少步数)。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,牛们只会水平或垂直地在X或Y轴上移动,他们从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫:

  1. +-+-+-+-+-+
  2. | |
  3. +-+ +-+ + +
  4. | | | |
  5. + +-+-+ + +
  6. | | |
  7. +-+ +-+-+-+

如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。

【格式】

PROGRAM NAME: maze1

INPUT FORMAT:

(file maze1.in)

  1. 第一行: WH(用空格隔开)
  2. 第二行至第2 * H + 1行: 每行2 * W + 1个字符表示迷宫

OUTPUT FORMAT:

(file maze1.out)

  1. 输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。

【分析】

直接上BFS了。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <cstring>
  6. #include <queue>
  7. const int maxh=;
  8. const int INF=;
  9. using namespace std;
  10. struct node
  11. {
  12. int x,y;//坐标
  13. int step;//步数
  14. }Exit[];
  15. int map[maxh][maxh],w,h;
  16. int dx[]={,-,,},dy[]={,,,-};//方向
  17. int low[maxh][maxh];
  18.  
  19. void init();
  20. void bfs(int num);//出口编号
  21.  
  22. int main()
  23. {
  24. //文件操作
  25. freopen("maze1.in","r",stdin);
  26. freopen("maze1.out","w",stdout);
  27. init();
  28. //printf("%d %d\n",Exit[0].x,Exit[0].y);
  29. //printf("%d %d",Exit[1].x,Exit[1].y);
  30. bfs();bfs();//分别从两个出口广搜
  31. int ans=;
  32. for (int i=;i<=*h+;i++)
  33. for (int j=;j<=*w+;j++)
  34. if (low[i][j]!=INF) ans=max(ans,low[i][j]);
  35. printf("%d",ans);
  36. return ;
  37. }
  38. void init()
  39. {
  40. int point=,i,j;
  41. memset(map,,sizeof(map));
  42. memset(low,,sizeof(low));
  43. scanf("%d%d",&w,&h);
  44. for (i=;i<=*h+;i++)
  45. {
  46. getchar();//去除换行符
  47. for (j=;j<=*w+;j++)
  48. {
  49. char temp;
  50. scanf("%c",&temp);
  51. map[i][j]=;
  52. low[i][j]=INF;//初始化
  53. //找出口
  54. if ((i== || i==(*h+) || j== || j==(*w+)) && map[i][j]==)
  55. {
  56. Exit[point].x=i;if (i==) Exit[point].x++;else if (i==*h+) Exit[point].x--;
  57. Exit[point].y=j;if (j==) Exit[point].y++;else if (j==*w+) Exit[point].y--;
  58. Exit[point++].step=;
  59. }
  60. }
  61. }
  62. }
  63. void bfs(int num)
  64. {
  65. int i;
  66. queue<node>Q;
  67. while (!Q.empty()) Q.pop();
  68. Q.push(Exit[num]);
  69. low[Exit[num].x][Exit[num].y]=;
  70. while (!Q.empty())
  71. {
  72. node u=Q.front();Q.pop();
  73. for (i=;i<;i++)
  74. {
  75. node v;
  76. v.x=u.x+dx[i];v.y=u.y+dy[i];
  77. v.step=u.step+;
  78. if (map[v.x][v.y]==) continue;
  79. v.x+=dx[i];v.y+=dy[i];//跨步
  80. if (v.step<low[v.x][v.y])
  81. {
  82. low[v.x][v.y]=v.step;
  83. Q.push(v);
  84. }
  85. }
  86. }
  87. }

【USACO 2.4.2】穿越栅栏的更多相关文章

  1. 洛谷P1519 穿越栅栏 Overfencing

    P1519 穿越栅栏 Overfencing 69通过 275提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 USACO是100分,洛谷是20分 为什么 ...

  2. 【刷题】洛谷 P1519 穿越栅栏 Overfencing

    题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...

  3. luogu P1519 穿越栅栏 Overfencing

    题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...

  4. USACO 4.1.2 栅栏的木料

    这个讲的超好....一定要看...然后看我代码就好懂啦... http://blog.csdn.net/ta201314/article/details/41287567 各种优化确实非常好....搜 ...

  5. [USACO 3.3.1]骑马修栅栏t

    [USACO 3.3.1]骑马修栅栏 时间限制: 1 Sec  内存限制: 64 MB提交: 39  解决: 17[提交][状态][讨论版] 题目描述 农民John每年有很多栅栏要修理.他总是骑着马穿 ...

  6. 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径

    Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...

  7. USACO Section 3.3 骑马修栅栏 Riding the Fences

    题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...

  8. 【USACO 3.3.1】骑马修栅栏

    [描述] Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入 ...

  9. USACO 3.3.1 Riding the Fences 骑马修栅栏(欧拉回路)

    Description 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程 ...

随机推荐

  1. Java实现二叉树的构建与遍历

    转载:http://ocaicai.iteye.com/blog/1047397 目录: 1.把一个数组的值赋值给一颗二叉树 2.具体代码 1.树的构建方法 2.具体代码 package tree; ...

  2. java学习之语句结构

    在java语言当中存在4中语句结构,分别是: 1.顺序结构 2.判断结构 3.选择结构 4.循环结构 一.顺序结构: 所谓的顺序结构,也就是当不指定其他三种语句结构的情况下,语句是从上往下依次执行的, ...

  3. vijos1082丛林探险

    P1082丛林探险 描述 东非大裂谷中有一片神秘的丛林,是全世界探险家的乐园,著名黄皮肤探险家BB一直想去试试.正好我国科学家2005年4月将首次对东非大裂谷进行科考,BB决定随科考队去神秘丛林探险. ...

  4. module_init和init_module的区别

    今天在看CS8900的驱动时,发现其驱动的模块加载函数是init_module(),由于看到大多数的驱动用的模块加载函数大多是module_init()函数,所以一时没缓过神来,总是在找CS8900的 ...

  5. (转载)PHP去掉转义后字符串中的反斜杠\函数stripslashes

    (转载)http://www.beijibear.com/index.php?aid=182 addslashes()函数主要是在字符串中添加反斜杠对特殊字符进行转义,stripslashes()则是 ...

  6. 【动态规划】【二分】【最长上升子序列】Vijos P1028 魔族密码

    题目链接: https://vijos.org/p/1028 题目大意: 给N个字符串(N<=2000),求能组成词链的单词最多有几个. 如果在一个由一个词或多个词组成的表中,除了最后一个以外, ...

  7. C++引用变量学习

    版权所有,转载请注明来源 (1)reference variable(rv) 主要用处是作为方程的形式参数,使用rv 可以直接对原数据进行操作而不是该数据的拷贝,节省了时间和空间,尤其是对于结构体以及 ...

  8. motan源码分析十:流量切换

    motan提供了流量切换的功能,可以实现把一个group的流量切换到另一个group(一个或多个服务都可以).大家可以使用tomcat部署motan的管理工具,并设置几个组,例如可以参考demo代码: ...

  9. 使用Xcode8的Instruments检测解决iOS内存泄露(leak)

    在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原 ...

  10. 关于Form窗体的StartPosition 属性如何设置的问题

    1.让窗体在启动时在指定位置出现 form1.StartPosition Manual CenterScreen WindowsDefaultLocation (default) WindowsDef ...