题目描述

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

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

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

小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。“.”表示小镇上那块地方是可以行车的,而符号“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就将当前的所有更新的值存进去当个暂存器,进行下一次再取出来更新就完成了本题更新操作

代码:

void update()//update就是我们进行存储的操作
{
while(!keay.empty())
{
que.push(keay.front());//push回que队列
keay.pop();
}
}

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

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

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

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

代码:

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

完整代码:

#include <iostream>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
const int N=;
char Map[N][N];
bool vis[N][N][+];
int n,m,op,flag,startx,starty;
struct Node//结构体不解释
{
int x,y;
};
queue<struct Node> keay;//此题核心:queue<struct Node>keay这个队列可以看作为中转站将que这个队列每次更新的数值存储起来
queue<struct Node> que;//再由keay队列push回que再次更新从而达到遍历全图的目的
void update()//update就是我们进行存储的操作
{
while(!keay.empty())
{
que.push(keay.front());//push回que队列
keay.pop();
}
}
void bfs(int dir,int t)//bfs进行遍历
{
struct Node now;
if(flag==)//这个地方可以写在主函数(我这样写麻烦了些)flag
{ //为了防止每次从keay队列弹回que队列时多加入初始点所以我们用flag标记一下
now.x=startx;now.y=starty;
que.push(now);
flag++;
}
while(!que.empty())
{
now=que.front();
que.pop();
if(vis[now.x][now.y][t])
continue;
vis[now.x][now.y][t]=true;
for(int i=;;i++)
{
if(dir==)
{
int xx=now.x-i;
int yy=now.y;
if(xx<) break;
if(Map[xx][yy]=='X') break;
if(t==op)
Map[xx][yy]='*';
struct Node next;
next.x=xx;next.y=yy;
keay.push(next);
}
if(dir==)
{
int xx=now.x;
int yy=now.y-i;
if(yy<) break;
if(Map[xx][yy]=='X') break;
if(t==op)
Map[xx][yy]='*';
struct Node next;
next.x=xx;next.y=yy;
keay.push(next);
}
if(dir==)//...........
{
int xx=now.x;
int yy=now.y+i;
if(yy>m) break;
if(Map[xx][yy]=='X') break;
if(t==op)
Map[xx][yy]='*';
struct Node next;
next.x=xx;next.y=yy;
keay.push(next);
}
if(dir==)//...........
{
int xx=now.x+i;
int yy=now.y;
if(xx>n) break;
if(Map[xx][yy]=='X') break;
if(t==op)
Map[xx][yy]='*';
struct Node next;
next.x=xx;next.y=yy;
keay.push(next);
}
}
}
return;
}
int main()
{
cin>>n>>m;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
cin>>Map[i][j];
if(Map[i][j]=='*')
{
startx=i;
starty=j;
Map[i][j]='.';
}
}
}
cin>>op;//操作方向个数
for(int i=;i<=op;i++)
{
string s;
int direct;
cin>>s;
if(s=="NORTH") direct=;
if(s=="WEST") direct=;
if(s=="EAST") direct=;
if(s=="SOUTH") direct=;
bfs(direct,i);
if(i<op)
update();
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
cout<<Map[i][j];
}
cout<<endl;
}
return ;
}

 

 

洛谷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. js获取站点根目录

    function getRootPath(){        var strFullPath=window.document.location.href;        var strPath=win ...

  2. FFMPEG系列一:Mac下FFMPEG编译安装配置及使用例子

    系统环境:10.13以前系统版本,没有升级到macOS High Sierra.正常情况是直接输入brew install ffmpeg即可安装ffmpeg,但是该过程还是有一些坑需要填. 一.mac ...

  3. onload函数不执行

    原因: <jsp:include page="">通过该标签引入jsp时会导致<body>失效 案例: <jsp:include page=" ...

  4. RPAD()和LPAD()函数进行字符串的填充

    RPAD()函数从右边对字符串使用指定的字符进行填充. 格式:RPAD(string,padded_length,[pad_string]) string 表示:被填充的字符串. padded_len ...

  5. zTree的核心处理逻辑

    zTree 是一个前端树形结构的插件. 使用起来很简单,我们重点关注一下插件的核心代码. 首先,zTree需要如下的数据结构: let areaData = [ { "id": & ...

  6. 日常工作linux常用命令

    1:cp 复制文件/文件夹 cp -r  源目录 目标目录 2:mv 文件重命名 mv 源文件/源目录  目标文件/目标目录 3:du -sh 查看当前目录大小 du -l 查看当前目录下文件大小 d ...

  7. 【解决】docker 容器中 consul集群问题处理

    现象描述:   node1 和node2 日志反复出现 add remove node3节点. node3 节点 一直 驳回 node1 和node2 认为node3已经dead的消息  不断重启se ...

  8. Linux运维一定要知道的六类好习惯和23个教训,避免入坑!

    Linux运维一定要知道的六类好习惯和23个教训,避免入坑! 从事运维三年半,遇到过各式各样的问题,数据丢失,网站挂马,误删数据库文件,黑客攻击等各类问题. 今天简单整理一下,分享给各位小伙伴. 一. ...

  9. Qt on Android 蓝牙通信开发

    版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...

  10. 中恳中笨 搭建flask封装环境

    话不多说,先干再说..... 打开pycharm,创建一个关于flask的项目 2.创建一个App的文件包 3.把staic和templates文件包拖进App里 4.把app.py文件改为manag ...