题解 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* ...
随机推荐
- MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法
http://blog.csdn.net/xgx198831/article/details/6713651 MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法 或许还有其它更好的办法,但下 ...
- js对数组处理(数组里边相同元素提取成map)
1.数组里边相同元素提取成map,并以‘’,‘’分隔 例如:var arr = [{a:"xx",b:''xxx''},{a:"xxx",b:''xxxxx'' ...
- Java并发编程,互斥同步和线程之间的协作
互斥同步和线程之间的协作 互斥同步 Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLo ...
- C - How Many Tables
#include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> ...
- cobian backup 11 使用
主机和备份机器创建备份用户(bf) 在备份机器上 设置备份用户, 备份目录右键安全,添加刚刚创建的备份bf用户,并授予所有权限 设置文件夹共享,并设置共享用户为刚刚创建的bf用户 并且在高级共享设置去 ...
- SpringBoot | 遇坑总结 | JPA
1. Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when ...
- wmq的队伍 BIT优化dp
http://oj.xjtuacm.com/problem/14/ wmq的队伍 发布时间: 2017年4月9日 17:06 最后更新: 2017年4月9日 17:07 时间限制: 2000m ...
- 将Form以强类型Model提交,后台获取不到的问题
F.TextBoxFor(m => m.Name) 不能自定ID属性
- 解析Javascript事件冒泡机制(转)
本文转自:http://blog.csdn.net/luanlouis/article/details/23927347 1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然 ...
- JS排序--快速排序
用 JavaScript 实现快速排序代码如下: /* * @author liphong * @data 2019/02/24 */ var arr = []; // 需要被排序数组 /* * 分离 ...