洛谷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,"山村游历"是自己搞出来的中文名. 数据自 ...
随机推荐
- logistic regression svm hinge loss
二类分类器svm 的loss function 是 hinge loss:L(y)=max(0,1-t*y),t=+1 or -1,是标签属性. 对线性svm,y=w*x+b,其中w为权重,b为偏置项 ...
- 6.Spring Cloud初相识-------Zool路由
前言: 在生产环境中,我们不可能将每个服务的真实信息暴漏出去,因为这样太不安全. 我们会选择使用路由代理真实的服务信息,由它负责转发给真实的服务. 新建一个Zool: 1.添加依赖 <?xml ...
- Django-rest-framework(七)swagger使用
在我们接口开发完之后,需要交付给别人对接,在没有使用swagger的时候,我们需要单独编写一份api接口文档,由postman之类的工具进行请求得到返回的结果.而有了swagger之后,可以通过提取接 ...
- 构建Linux根文件系统(未完待续)
所谓制作根文件系统, 就是创建各种目录, 并且在里面创建各种文件. 比如在/bin ./sbin 目录下存放各种可执行程序, 在/etc 目录下存放配置文件, 在/lib 目录下存放库文件 ...
- SpringCloud微服务实战:一、Eureka注册中心服务端
1.项目启动类application.java类名上增加@EnableEurekaServer注解,声明是注册中心 1 import org.springframework.boot.SpringAp ...
- beep版千与千寻主题曲(转载自Ice_watermelon233)
#include <bits/stdc++.h> #include <windows.h> #define qdo 262 #define qre 294 #define qm ...
- 【解题报告】小白逛公园 vijos
题目传送门 这道题是一道线段树的一个求一个连续最大字段和是一个区间线段树一个很妙妙的操作,这里后面我们后面就会提到,因为今天博主没有时间了所以先粘一篇代码供大家参考,其实代码理解还是非常的简单的. 代 ...
- ABAP术语-Accounting Document
Accounting Document 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/12/991731.html Accounting d ...
- JQuery实现注册表单验证
效果图如下: 注册页面HTML代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...
- Percona XtraDB Cluster 5.7安装配置
优点:1.准同步复制2.多个可同时读写节点,可实现写扩展,较分片方案更进一步3.自动节点管理4.数据严格一致5.服务高可用缺点:1.只支持innodb引擎2.所有表都要有主键3.所有的写操作都将发生在 ...