题目描述

年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置。

那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。

编写程序,通过使用一张小镇的地图帮助警察局找到那辆车。程序必须能表示出该车最终所有可能的位置。

小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。“.”表示小镇上那块地方是可以行车的,而符号“X”表示此处不能行车。

拉尔夫所开小车的初始位置用字符的“*”表示,且汽车能从初始位置通过。

汽车能向四个方向移动:向北(向上),向南(向下),向西(向左),向东(向右)。

拉尔夫所开小车的行动路线是通过一组给定的方向来描述的。在每个给定的方向,拉尔夫驾驶小车通过小镇上一个或更多的可行车地点。

输入输出格式

输入格式:

输入文件的第一行包含两个用空格隔开的自然数R和C,1≤R≤50,1≤C≤50,分别表示小镇地图中的行数和列数。

以下的R行中每行都包含一组C个符号(“.”或“X”或“*”)用来描述地图上相应的部位。

接下来的第R+2行包含一个自然数N,1≤N≤1000,表示一组方向的长度。

接下来的N行幅行包含下述单词中的任一个:NORTH(北)、SOUTH(南)、WEST(西)和EAST(东),表示汽车移动的方向,任何两个连续的方向都不相同。

输出格式:

用R行表示的小镇的地图(象输入文件中一样),字符“*”应该仅用来表示汽车最终可能出现的位置。

输入输出样例:

输入:
4 5

. . . . .

. x . . .

. . . * x

x . x . .

3

NORTH

WEST

SOUTH

输出:
. . . . .

* x * . .

* . * . x

x . x . .

思路:

题目描述的很清楚了,我就简单的在说一遍吧,由题意得我们需要在图中遍历找出能停车的所有点但是能停车的点是有要求的,

当输入时我们会给出N个不同的方向,我们在图中遍历时必须满足行走完这N个不同的方向才能停车且用“*”表示.

很直接的我们第一时间会想到搜索BFS或者DFS(因为我比较喜欢BFS于是这篇题解就是用BFS实现的).

但是这题的移动方向是未明确的,我的意思是我们必须在输入中才能明确我们的移动方向,因此我们将会进行多次BFS但是我们知道每当进行一次BFS,

我们的队列就会弹空,因此当我们进行下一个方向的遍历时就无法用上一个状态更新所以这题的核心到了我们需要两个队列que和keay

que即我们BFS所需要的队列,keay就是每当我们跑完一边BFS就将当前的所有更新的值存进去当个暂存器,进行下一次再取出来更新就完成了本题更新操作

代码:

  1. void update()//update就是我们进行存储的操作
  2. {
  3. while(!keay.empty())
  4. {
  5. que.push(keay.front());//push回que队列
  6. keay.pop();
  7. }
  8. }

这题重要的核心思想完成了

接下来我们讲此题可能出现的情况.

由题意我们可以得知我们需要将能停车的地方更新为字符"*"

但是如果这个点我们在之前就已经更新过那我们以后的更新就是重复的这个地方我们就可以剪枝否则很有可能会超时

代码:

  1. if(vis[now.x][now.y][t])
  2. continue;
  3. vis[now.x][now.y][t]=true;

完整代码:

  1. #include <iostream>
  2. #include <cstring>
  3. #include <string>
  4. #include <queue>
  5. using namespace std;
  6. const int N=;
  7. char Map[N][N];
  8. bool vis[N][N][+];
  9. int n,m,op,flag,startx,starty;
  10. struct Node//结构体不解释
  11. {
  12. int x,y;
  13. };
  14. queue<struct Node> keay;//此题核心:queue<struct Node>keay这个队列可以看作为中转站将que这个队列每次更新的数值存储起来
  15. queue<struct Node> que;//再由keay队列push回que再次更新从而达到遍历全图的目的
  16. void update()//update就是我们进行存储的操作
  17. {
  18. while(!keay.empty())
  19. {
  20. que.push(keay.front());//push回que队列
  21. keay.pop();
  22. }
  23. }
  24. void bfs(int dir,int t)//bfs进行遍历
  25. {
  26. struct Node now;
  27. if(flag==)//这个地方可以写在主函数(我这样写麻烦了些)flag
  28. { //为了防止每次从keay队列弹回que队列时多加入初始点所以我们用flag标记一下
  29. now.x=startx;now.y=starty;
  30. que.push(now);
  31. flag++;
  32. }
  33. while(!que.empty())
  34. {
  35. now=que.front();
  36. que.pop();
  37. if(vis[now.x][now.y][t])
  38. continue;
  39. vis[now.x][now.y][t]=true;
  40. for(int i=;;i++)
  41. {
  42. if(dir==)
  43. {
  44. int xx=now.x-i;
  45. int yy=now.y;
  46. if(xx<) break;
  47. if(Map[xx][yy]=='X') break;
  48. if(t==op)
  49. Map[xx][yy]='*';
  50. struct Node next;
  51. next.x=xx;next.y=yy;
  52. keay.push(next);
  53. }
  54. if(dir==)
  55. {
  56. int xx=now.x;
  57. int yy=now.y-i;
  58. if(yy<) break;
  59. if(Map[xx][yy]=='X') break;
  60. if(t==op)
  61. Map[xx][yy]='*';
  62. struct Node next;
  63. next.x=xx;next.y=yy;
  64. keay.push(next);
  65. }
  66. if(dir==)//...........
  67. {
  68. int xx=now.x;
  69. int yy=now.y+i;
  70. if(yy>m) break;
  71. if(Map[xx][yy]=='X') break;
  72. if(t==op)
  73. Map[xx][yy]='*';
  74. struct Node next;
  75. next.x=xx;next.y=yy;
  76. keay.push(next);
  77. }
  78. if(dir==)//...........
  79. {
  80. int xx=now.x+i;
  81. int yy=now.y;
  82. if(xx>n) break;
  83. if(Map[xx][yy]=='X') break;
  84. if(t==op)
  85. Map[xx][yy]='*';
  86. struct Node next;
  87. next.x=xx;next.y=yy;
  88. keay.push(next);
  89. }
  90. }
  91. }
  92. return;
  93. }
  94. int main()
  95. {
  96. cin>>n>>m;
  97. for(int i=;i<=n;i++)
  98. {
  99. for(int j=;j<=m;j++)
  100. {
  101. cin>>Map[i][j];
  102. if(Map[i][j]=='*')
  103. {
  104. startx=i;
  105. starty=j;
  106. Map[i][j]='.';
  107. }
  108. }
  109. }
  110. cin>>op;//操作方向个数
  111. for(int i=;i<=op;i++)
  112. {
  113. string s;
  114. int direct;
  115. cin>>s;
  116. if(s=="NORTH") direct=;
  117. if(s=="WEST") direct=;
  118. if(s=="EAST") direct=;
  119. if(s=="SOUTH") direct=;
  120. bfs(direct,i);
  121. if(i<op)
  122. update();
  123. }
  124. for(int i=;i<=n;i++)
  125. {
  126. for(int j=;j<=m;j++)
  127. {
  128. cout<<Map[i][j];
  129. }
  130. cout<<endl;
  131. }
  132. return ;
  133. }

 

 

洛谷P1189'SEARCH'的更多相关文章

  1. 洛谷P1189 SEARCH 题解 迭代加深

    题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...

  2. 洛谷—— P1189 SEARCH

    https://www.luogu.org/problem/show?pid=1189 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子 ...

  3. 洛谷P1189 逃跑的拉尔夫(SEARCH)

    洛谷1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的 ...

  4. 洛谷U19464 山村游历(Wander)(LCT,Splay)

    洛谷题目传送门 LCT维护子树信息常见套路详见我的总结 闲话 题目摘自WC模拟试题(by Philipsweng),原题目名Wander,"山村游历"是自己搞出来的中文名. 数据自 ...

  5. 洛谷 P1706 全排列问题

    题目链接 https://www.luogu.org/problemnew/show/P1706 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数 ...

  6. 洛谷 P2404 自然数的拆分问题

    题目链接 https://www.luogu.org/problemnew/show/P2404 题目背景 木有...... 题目描述 任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和. ...

  7. [洛谷日报第62期]Splay简易教程 (转载)

    本文发布于洛谷日报,特约作者:tiger0132 原地址 分割线下为copy的内容 [洛谷日报第62期]Splay简易教程 洛谷科技 18-10-0223:31 简介 二叉排序树(Binary Sor ...

  8. 【新知识】队列&bfs【洛谷p1996约瑟夫问题&洛谷p1451求细胞数量】

    (是时候为五一培训准备真正的技术了qwq) part1  队列(FIFO) 算法简介: FIFO:First In First Out(先进先出) 队列是限定在一端进行插入,另一端进行删除的特殊线性表 ...

  9. 洛谷U19464 山村游历(Wander)(LCT)

    洛谷题目传送门 LCT维护子树信息常见套路详见我的总结 闲话 题目摘自WC模拟试题(by Philipsweng),原题目名Wander,"山村游历"是自己搞出来的中文名. 数据自 ...

随机推荐

  1. Android学习笔记_46_Android的intent之间Object、List、List<Object>和全局变量数据的传递(Parcelable Serializable)

    转http://blog.csdn.net/pku_android/article/details/7456305 一.传递List<String>和List<Integer> ...

  2. Dependency Injection in ASP.NET Web API 2 (在web api2 中使用依赖注入)

    原文:http://www.asp.net/web-api/overview/advanced/dependency-injection 1 什么是依赖注入(Dependency Injection) ...

  3. 解密Spring加载的Properties文件

    Spring的框架中,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类可以将.properties(key ...

  4. JavaScript js调用堆栈(三)

    本文主要深入介绍JavaScript内存机制 内存模型 JS内存空间分为栈(stack),堆(heap),池(一般也会归类为栈中),其中栈存放变量,堆存放复杂对象,池存放常量. 注:闭包中的变量并不保 ...

  5. Element.getBoundingClientRect()

    Element.getBoundingClientRect()方法会返回元素的大小和相对于视口的位置 语法: var domRect = element.getBoundingClientRect() ...

  6. SpringMVC知识点总结

    1. SpringMVC概述        SpringMVC是一个WEB层框架,主要用来负责与页面的交互.        SpringMVC是Spring家族的一大组件.Spring整合Spring ...

  7. iOS9全新的联系人相关框架——Contacts Framework

    iOS9全新的联系人相关框架——Contacts Framework 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用 ...

  8. 一站式学习Redis 从入门到高可用分布式实践(慕课)第六章 Redis开发运维常见问题

    fork操作 1.同步操作 2.与内存量息息相关:内存越大,耗时越长(与机器类型有关) 3.info:latest_fork_usec 进程外开销 AOF追加阻塞 不知道哪个命令??? 单机多实例部署 ...

  9. meclipse6.5破解

    package com.test.ssh.common;   import java.text.DecimalFormat; import java.text.NumberFormat; import ...

  10. 【模板】全排列(运用STL的next_permutation)

    (1) 先将要排列的数据存入数组中: (2) 再将数组元素从小到大排序: (3) 每次调用next_permutation函数,都只进行1次排列,若数组元素完全变为递减的排列,则该函数返回0: int ...