洛谷P1189'SEARCH'
题目描述
年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置。
那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。
编写程序,通过使用一张小镇的地图帮助警察局找到那辆车。程序必须能表示出该车最终所有可能的位置。
小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。“.”表示小镇上那块地方是可以行车的,而符号“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'的更多相关文章
- 洛谷P1189 SEARCH 题解 迭代加深
题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...
- 洛谷—— P1189 SEARCH
https://www.luogu.org/problem/show?pid=1189 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子 ...
- 洛谷P1189 逃跑的拉尔夫(SEARCH)
洛谷1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的 ...
- 洛谷U19464 山村游历(Wander)(LCT,Splay)
洛谷题目传送门 LCT维护子树信息常见套路详见我的总结 闲话 题目摘自WC模拟试题(by Philipsweng),原题目名Wander,"山村游历"是自己搞出来的中文名. 数据自 ...
- 洛谷 P1706 全排列问题
题目链接 https://www.luogu.org/problemnew/show/P1706 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数 ...
- 洛谷 P2404 自然数的拆分问题
题目链接 https://www.luogu.org/problemnew/show/P2404 题目背景 木有...... 题目描述 任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和. ...
- [洛谷日报第62期]Splay简易教程 (转载)
本文发布于洛谷日报,特约作者:tiger0132 原地址 分割线下为copy的内容 [洛谷日报第62期]Splay简易教程 洛谷科技 18-10-0223:31 简介 二叉排序树(Binary Sor ...
- 【新知识】队列&bfs【洛谷p1996约瑟夫问题&洛谷p1451求细胞数量】
(是时候为五一培训准备真正的技术了qwq) part1 队列(FIFO) 算法简介: FIFO:First In First Out(先进先出) 队列是限定在一端进行插入,另一端进行删除的特殊线性表 ...
- 洛谷U19464 山村游历(Wander)(LCT)
洛谷题目传送门 LCT维护子树信息常见套路详见我的总结 闲话 题目摘自WC模拟试题(by Philipsweng),原题目名Wander,"山村游历"是自己搞出来的中文名. 数据自 ...
随机推荐
- HDU 1045 Fire Net(dfs,跟8皇后问题很相似)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
- Java8函数之旅 (六) -- 使用lambda实现Java的尾递归
前言 本篇介绍的不是什么新知识,而是对前面讲解的一些知识的综合运用.众所周知,递归是解决复杂问题的一个很有效的方式,也是函数式语言的核心,在一些函数式语言中,是没有迭代与while这种概念的,因为此类 ...
- 9.异常Exception
9.1 异常概述 package exception; /* * 异常:程序运行的不正常情况 * * Throwable: 异常的超类 * |-Error * 严重问题,这种问题我们通过异常处理是不能 ...
- python之yield表达式
yield表达式用于generator function 调用generator function时,返回一个iterator(函数内语句不被会执行),调用iterator函数时,执行到yield表达 ...
- Object C学习笔记19-枚举(转)
一. 枚举类型 枚举类型是一个基本类型,不能再分为为任何其他的类型.在一般的编程语言中都有枚举(enum)这种数据结构类型.枚举类型主要用于将一个变量限定在特定的范围内.比如一周有七天,那么一周的值就 ...
- c# LRU实现的缓存类
在网上找到网友中的方法,将其修改整理后,实现了缓存量控制以及时间控制,如果开启缓存时间控制,会降低效率. 定义枚举,移除时使用 public enum RemoveType { [ ...
- GitHub的搭建,使用
Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括Rubinius ...
- js函数只触发一次
如何让js中的函数只被执行一次?我们有时候会有这种需求,即让一个函数只执行一次,第二次调用不会返回任何有价值的值,也不会报错.下面将通过三个小demo展示使用的方法,当做个人笔记. 1.通过闭包来实现 ...
- java.util.ArrayList,java.util.LinkedList,java.util.Vector的区别,使用场合.
下图是Collection的类继承图 从图中可以看出:Vector.ArrayList.LinkedList这三者都实现了List 接口.所有使用方式也很相似,主要区别在于实现方式的不同,所以对不同的 ...
- JDK7 新特性
JDK7新特性的目录导航: 二进制字面值 switch 语句支持 String try-with-resources catch 多个类型异常 字面值中使用下划线 类型推断 改进泛型类型可变参数 其它 ...