题目描述

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

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

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

小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。“.”表示小镇上那块地方是可以行车的,而符号“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. Android学习笔记_76_Android ProgressBar 进度条

    android 进度条的样式  例1:(默认样式(中等圆形))Xml代码 <ProgressBar      android:id="@+id/progressBar1"   ...

  2. 自定义AngularJS中的services服务

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  3. generative models

    A generative model G can be seen as taking a random seed h (say, a sample from a multivariate Normal ...

  4. BZOJ2580: [Usaco2012 Jan]Video Game(AC自动机)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 159  Solved: 110[Submit][Status][Discuss] Descriptio ...

  5. vue项目中缓存问题

    单页面应用总是存在缓存问题,特别是在微信端,更新页面之后访问的还是老页面,缓存的问题是因为用户访问的脚本地址并没有改变,浏览器就会读取原来的脚本 网上有几种解决办法,首先列举一下 1.加meta,禁止 ...

  6. CSS3--j惊艳到你的新前端

    一.css3的选择器 1. 父子选择器 直接关系 .box>.com 2. 兄弟选择器 相邻关系 .box+.com <span>hello</span> <p&g ...

  7. PHP基础 (麦子学院 第二阶段)

    zendstudio 10.0破解版,新建完项目后,首先修改项目的编码方式,统一改成utf-8 (选中项目,再右键properties:Text file encoding).修改字体大小. apac ...

  8. 总结laravel假数据填充步骤

    定义好模型 xxx.php 定义好数据生成的规则 database/factories/XxxlFactory.php 写入生成数据的代码,控制好生成的数据数目,对生成后的数据做出修改 databas ...

  9. HBase学习(三):数据模型

    和传统的关系型数据库类似,HBase以表(Table)的方式组织数据.HBase的表由行(Row)和列(Column)共同构成,与关系型数据库不同的是HBase有一个列族(ColumnFamily)的 ...

  10. Python学习第二弹

    昨天补充: 编码: Unicode ; utf-8 ; GBK       关系:   关键字:1. continue 终止当前循环,进行下一次循环 2. break      终止循环 题6解法2: ...