题解 P1189 SEARCH
(传送门)[https://www.luogu.org/problemnew/show/P1189]
先反省一波:我以后再也不用getchar()+scanf了(日常爆零)
算是比较裸的搜索吧,在下用的算是DFS(严格说来应该是枚举)+在线处理吧,就是一边输入方向一边处理,用ans数组表示输入这一次方向后汽车可能在的位置,每次输入方向后将不能继续前进的ans删去,将可以前进的ans更新到新的位置
void dfs(int x,int y,int dir,int l)
{
if(map[x+fx[dir]][y+fy[dir]]) //如果不能继续前进,那么这个ans一定是错的,将它删去
{
ans[x][y]=0;
return ;
}
for(int i=1;;i++) //知道我为什么说它是枚举了吧 qwq
{
int xx=x+fx[dir]*i,yy=y+fy[dir]*i;
if(xx<1||xx>n||yy<1||yy>m||map[xx][yy]) //不断前进,并将这条路全置为ans(因为都符合条件)
break;
ans[xx][yy]=l+1; //防止重复查找,即防止刚置为ans后没有进行下一重循环,直接在这层循环再搜一次
}
return ;
}
上面的dfs函数可以去掉不能继续前进的答案,加入新的答案,那么旧的答案该怎么办呢? 我们可以在循环到ans后直接将它删去,因为对我们来说它已经没用了。接下来直接上代码
#include<iostream>
#include<cstdio>
using namespace std;
bool map[51][51]; //判断有没有障碍物
int ans[51][51]; //存答案
char mmp[51][51]; //存地图,不要在意变量名
int n,m,k;
int fx[5]={0,0,0,1,-1}; //存方向,顺序是E、W、S、N
int fy[5]={0,1,-1,0,0};
void dfs(int x,int y,int dir,int l)
{
if(map[x+fx[dir]][y+fy[dir]]) //如果不能继续前进,那么这个ans一定是错的,将它删去
{
ans[x][y]=0;
return ;
}
for(int i=1;;i++) //知道我为什么说它是枚举了吧 qwq
{
int xx=x+fx[dir]*i,yy=y+fy[dir]*i;
if(xx<1||xx>n||yy<1||yy>m||map[xx][yy]) //不断前进,并将这条路全置为ans(因为都符合条件)
break;
ans[xx][yy]=l+1; //防止重复查找,即刚置为ans后没有进行下一重循环,直接在这层循环再搜一次
}
return ;
}
int main()
{
输入+预处理地图
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mmp[i][j];
if(mmp[i][j]=='X') map[i][j]=1;
if(mmp[i][j]=='*') ans[i][j]=1;
}
}
//在线查找
scanf("%d",&k);
for(int o=1;o<=k;o++)
{
char a[10]; scanf("%s",a);
if(a[0]=='E')
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(ans[i][j]==o)
{
ans[i][j]=0; //将旧的答案删去,下同
dfs(i,j,1,o); //用当层的答案去寻找新的答案
}
}
}
if(a[0]=='W')
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(ans[i][j]==o)
{
ans[i][j]=0;
dfs(i,j,2,o);
}
}
}
if(a[0]=='S')
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(ans[i][j]==o)
{
ans[i][j]=0;
dfs(i,j,3,o);
}
}
}
if(a[0]=='N')
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(ans[i][j]==o)
{
ans[i][j]=0;
dfs(i,j,4,o);
}
}
}
}
//输出
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(!ans[i][j]&&mmp[i][j]=='*'){cout<<'.'; continue;}
if(!ans[i][j])
cout<<mmp[i][j];
else
cout<<'*';
}
cout<<endl;
}
return 0;
}
题解 P1189 SEARCH的更多相关文章
- P1189 SEARCH(逃跑的拉尔夫)
P1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移 ...
- 洛谷P1189 SEARCH 题解 迭代加深
题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...
- LeetCode题解33.Search in Rotated Sorted Array
33. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some piv ...
- leetcode 题解:Search in Rotated Sorted Array II (旋转已排序数组查找2)
题目: Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would t ...
- leetcode题解:Search in Rotated Sorted Array(旋转排序数组查找)
题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 ...
- LintCode题解之Search Range in Binary Search Tree
1.题目描述 2.问题分析 首先将二叉查找树使用中序遍历的方式将元素放入一个vector,然后在vector 中截取符合条件的数字. 3.代码 /** * Definition of TreeNode ...
- leetcode个人题解——#33 Search in Rotated Sorted Array
思路:每次取中间元素,一定有一半有序,另一半部分有序,有序的部分进行二分查找,部分有序的部分递归继续处理. class Solution { public: ; int middleSearch(in ...
- 洛谷P1189'SEARCH'
题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息. 编写程 ...
- leetcode 题解 word search。递归可以更简洁。
先写上我的代码: 我总是不知道何时把任务交给下一个递归.以致于,写出的代码很臃肿! 放上别人递归的简洁代码: bool exist(char** board, int m, int n, char* ...
随机推荐
- Vertex Lit 顶点光照
http://blog.csdn.net/heyuchang666/article/details/51565102 顶点光照(Vertex Lit) 是最低保真度的光照.不支持实时阴影的渲染路径.最 ...
- 关于 T[] 的反射问题
1. T[] 类型不适应以下代码 Dictionary<string, Test> d = new Dictionary<string, Test>(); // Get a T ...
- python 的 数据类型
数据类型 1.1整型int py2中有int有范围,超出自动转为long长整型,py3中只有int 整除py2中无小数,可加一行代码实现 十进制转二进制 print(bin(10))十进制转八进制 p ...
- Windows个人常用软件推荐
一.必装软件 浏览器:Google chrome Google Chrome是一款可让您更快速.轻松且安全地使用网络的浏览器,它的设计超级简洁,使用起来更加方便,支持多标签浏览,同时也支持扩展插件.下 ...
- Mysql 到 Hbase 数据如何实时同步,强大的 Streamsets 告诉你
很多情况大数据集群需要获取业务数据,用于分析.通常有两种方式: 业务直接或间接写入的方式 业务的关系型数据库同步到大数据集群的方式 第一种可以是在业务中编写代码,将觉得需要发送的数据发送到消息队列,最 ...
- Turtles (非纯分块)
http://codeforces.com/contest/103/problem/D #include <bits/stdc++.h> using namespace std; type ...
- excel输入值非法,限定了可以输入的数值怎么办
回到excel的编辑界面,点击工具栏的“数据”标签,如图所示. 继续在“数据”标签的下面找到“数据验证”或“数据有效性”的按钮,点击该选项,然后继续下一步. 在弹出的选择框中选择“数据验证”选项,如图 ...
- 深度学习环境搭建(Ubuntu16.04+GTX1080Ti+CUDA8.0+Cudnn6.0+TensorFlow+Caffe2(Pytorch))
OS System:Ubuntu16.04 GPU Device:GTX1080Ti Softwares:CUDA8.0.Cudnn6.0.TensorFlow(1.4.0).Caffe2(1.0.0 ...
- 洛谷 P1094 纪念品分组
P1094 纪念品分组 先按价格对纪念品排序(这里是从大到小),然后从两端向中心开始配对,有两个变量i和j,表示正在处理的两个纪念品编号,开始时i=1,j=n,如果a[i]+a[j]>w则第i贵 ...
- tera term 的一个命令解析脚本
;用虚拟串口虚拟2个串口,tera term使用串口2 ;设置串口2 波特率 115200,超时500ms;如果收到串口发来OK则回复SUCCESS;如果收到ERROR则回复faile;若超时则发送t ...