P1189 SEARCH—搜索
将这题加进来的原因
因为他的优化令人眼前一新!
↑这一题也要用到标记数组
优化!!!
对于一个位置,
如果他在同样的深度再一次被访问,那他接下来所走的路径,所得到的答案一定与之前相同,就没必要在一次访问了!!!
刚好这题的数据范围又很小。
\(\text{1}\) \(\le\) \(\text{R、C}\) \(\le\) \(\text{50}\)
\(\text{1}\) \(\le\) \(\text{N}\) \(\le\) \(\text{1000}\)
\(\text{1000}\) \(\times\) \(\text{50}\) \(\times\) \(\text{50}\) \(\times\) \(\text{4}\) \(=\) \(\text{1}\) \(\times\) \(10^7\)
\(10^7\) \(\div\) \(\text{8}\) \(\div\) \(\text{1024}\) \(\div\) \(\text{1024}\) \(=\) \(\text{1.}\) ...
完全够用~
所以再开一个\(\text{vis}\)数组
int vis[1005][55][55]
再加判断就ok了。
AC code
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
char a[51][51],ans[51][51];
int way[1005];
bool vis[1005][55][55];//!!!
int R,C,N;
void dfs(int x,int y,int d){
if(vis[d][x][y]==1) return;//!!!
vis[d][x][y]=1;
if(d==N+1){
ans[x][y]='*';
return;
}
if(way[d]==1)
for(int i=1;;i++){
if(x-i<1) break;
if(a[x-i][y]=='X') break;
dfs(x-i,y,d+1);
}
else if(way[d]==2){
for(int i=1;;i++){
if(x+i>R) break;
if(a[x+i][y]=='X') break;
dfs(x+i,y,d+1);
}
}
else if(way[d]==3){
for(int i=1;;i++){
if(y-i<1) break;
if(a[x][y-i]=='X') break;
dfs(x,y-i,d+1);
}
}
else{
for(int i=1;;i++){
if(y+i>C) break;
if(a[x][y+i]=='X') break;
dfs(x,y+i,d+1);
}
}
return;
}
int main(){
int x,y;
scanf("%d%d",&R,&C);
for(int i=1;i<=R;i++){
for(int j=1;j<=C;j++){
cin>>a[i][j];
if(a[i][j]=='*') x=i,y=j;
}
}
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++) ans[i][j]=a[i][j];
ans[x][y]='.';
scanf("%d",&N);
char s[10];
for(int i=1;i<=N;i++){
cin>>s;
if(s[0]=='N') way[i]=1;
if(s[0]=='S') way[i]=2;
if(s[0]=='W') way[i]=3;
if(s[0]=='E') way[i]=4;
}
dfs(x,y,1);
for(int i=1;i<=R;i++){
for(int j=1;j<=C;j++)
cout<<ans[i][j];
cout<<endl;
}
return 0;
}
summary
搜索的时候,如果发现对于一种状态,他之后的变化都相同,就可以进行标记,以防重复。
\(\text{END.}\)
\(\text{2022.5.8}\)
\(\text{2022.5.14}\)
今天又遇到了一道类似的题
P1746 离开中山路,用这种优化,遍历全图轻轻松松AC(●'◡'●)
P1189 SEARCH—搜索的更多相关文章
- 随笔之——各大热门网站search 搜索框的写法,浅析!
随笔之——各大热门网站search 搜索框的写法,浅析! 关于搜索框,写法有很多种,搜索框这一块是一个比较细的活,要先计算好他的高.宽: 下面我就以京东搜索框为例,给大家浅析一下. 上面就是最终s ...
- 【起航计划 032】2015 起航计划 Android APIDemo的魔鬼步伐 31 App->Search->Invoke Search 搜索功能 Search Dialog SearchView SearchRecentSuggestions
Search (搜索)是Android平台的一个核心功能之一,用户可以在手机搜索在线的或是本地的信息.Android平台为所有需要提供搜索或是查询功能的应用提 供了一个统一的Search Framew ...
- P1189 SEARCH(逃跑的拉尔夫)
P1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移 ...
- django的前后的结合,search搜索功能案例
利用django的Q()功能可以很好的展开搜索功能 假设我要做个这样的搜索功能
- 使用apt-cache search搜索想要的软件包
环境: Ubuntu14.10 我在编译u-boot代码的时候遇到了如下问题: LD test/dm/built-in.o CC examples/standalone/stubs.o LD exam ...
- 题解 P1189 SEARCH
(传送门)[https://www.luogu.org/problemnew/show/P1189] 先反省一波:我以后再也不用getchar()+scanf了(日常爆零) 算是比较裸的搜索吧,在下用 ...
- Odoo search 搜索视图详解与搜索视图工作原理
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826430.html 搜索视图 搜索视图的search标签本身没什么属性可以使用,只要是<searc ...
- 洛谷P1189 SEARCH 题解 迭代加深
题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...
- Sentry 监控 - Search 搜索查询实战
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
随机推荐
- [AcWing 778] 字符串最大跨距
点击查看代码 #include<iostream> using namespace std; string s, s1, s2; int main() { char c; while (c ...
- [操作系统]LINUX进程状态说明
R(task_running) : 可执行状态 只有在该状态的进程才可能在CPU上运行.而同一时刻可能有多个进程 处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的 ...
- 【Linux 网络编程】生动讲解 Reactor 模式与 Proactor 模式
五种 I/O 模型 先花费点时间了解这几种 I/O 模型,有助于后面的理解. 阻塞 I/O 与非阻塞 I/O 阻塞和非阻塞的概念能应用于所有的文件描述符,而不仅仅是 socket.我们称阻塞的文件描述 ...
- Oracle19c单实例数据库配置OGG单用户数据同步测试
目录 19c单实例配置GoldenGate 并进行用户数据同步测试 一.数据库操作 1.开启数据库附加日志 2.开启数据库归档模式 3.开启goldengate同步 4.创建goldengate管理用 ...
- python二分法、牛顿法求根
二分法求根 思路:对于一个连续函数,左值f(a)*右值f(b)如果<0,那么在这个区间内[a,b]必存在一个c使得f(c)=0 那么思路便是取中间点,分成两段区间,然后对这两段区间分别再比较,跳 ...
- re模块,正则表达式起别名和分组机制,collections模块,time与datetime模块,random模块
re模块和正则表达式别名和分组机制 命名分组 (1)分组--可以让我们从文本内容中提取指定模式的部分内容,用()来表示要提取的分组,需要注意的是分组 是在整个文本符合指定的正则表达式前提下进行的进一步 ...
- 评估海外pop点网络质量,批量探测到整个国家运营商ip地址段时延
1 查询当地供应商所有AS号和IP地址段,如下 可以手动复制也可以爬下来,此次测试地址不多,手动复制下来再做下格式话 61.99.128.0/17 61.99.0.0/16 61.98.96.0/20 ...
- 四、针对redis容灾切换导致"脑裂"的情况
网上参考到别人博客说,redis容灾切换的时候,有几率出现脑裂的情况. 什么是脑裂: sentinel判断master宕机,切换slave为新master的过程中,业务数据还在持续往原master写入 ...
- Celery-Task参数方法
@celery.task(bind=True, name='name') def function_name(): pass # task方法参数 name : 可以显式指定任务的名字:默认是模块的命 ...
- GIT速查手册
一.GIT 1.1 简单配置 git是版本控制系统,与svn不同的是git是分布式,svn是集中式 配置文件位置 # 配置文件 .git/config 当前仓库的配置文件 ~/.gitconfig 全 ...