洛谷 P2689 东南西北【模拟/搜索】
题目描述
给出起点和终点的坐标及接下来T个时刻的风向(东南西北),每次可以选择顺风偏移1个单位或者停在原地。求到达终点的最少时间。
如果无法偏移至终点,输出“-1”。
输入输出格式
输入格式:
第一行两个正整数x1,y1,表示小明所在位置。
第二行两个正整数x2,y2,表示小明想去的位置。
第三行一个整数T,表示T个时刻。
第四至第N+3行,每行一个字符,表示风向,即东南西北的英文单词的首字母。
输出格式:
最少走多少步。
输入输出样例
1 1
2 2
5
E
N
W
W
N
2
1 1
2 2
1
W
-1
1 1
2 2
3
W
W
W
-1
说明
样例1:向东走一步,向南走一步。
样例2、3:无法到达。
1<=T<=50
东:East
南:South
西:West
北:North
【分析】:注意:风从哪里来,就叫什么风,就往相反的方向走。
这个题是一个简单的模拟和搜索;只需要关注你要往哪里走,走多少步。
将一个二维数组分解,得到初始点和终点四个值;
最短路径就是分开跳,直至跳完,在验证是否到了终点;
//搜索
【代码】:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a,x,y,xx,yy;
char f[];
int cnt=;
int main()
{ cin>>x>>y;
cin>>xx>>yy;
cin>>a;
for(int i=;i<=a;i++)
{
cin>>f[i];
if(x>xx&&f[i]=='S') { x-=;cnt++;}
if(x<xx&&f[i]=='N') { x+=;cnt++;}
if(y>yy&&f[i]=='W') { y-=;cnt++;}
if(y<yy&&f[i]=='E') { y+=;cnt++;} }
if(x!=xx||y!=yy) cout<<"-1";
else cout<<cnt;
}
模拟
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char t; //t用来输入方向。
int next[][]={{,},{,},{-,},{,-}},book[][],way[],startx,starty,endx,endy,n,i,ans=; //book用来标记一个点走没走过,way储存了每一秒的风向。
int min(int x,int y)
{
return x<y?x:y;
}
int getnum(char c) //这个函数用来判断是东西南北里的哪一项。
{
if(c=='N')
{
return ;
}
if(c=='E')
{
return ;
}
if(c=='S')
{
return ;
}
if(c=='W')
{
return ;
}
}
void dfs(int x,int y,int now,int step) //step是现在几秒了,now是步数。
{
if(x==endx && y==endy) //如果到达。
{
ans=min(ans,now); //更新答案
return;
}
if(step==n+) //这里很重要,不然会RE。
{
return;
}
int tx,ty,k;
k=way[step];
tx=x+next[k][];
ty=y+next[k][];
if(tx>= && tx<=n && ty>= && ty<=n && book[tx][ty]==) //如果这一秒风吹我走没有越界也没有来过这就代表可以走
{
book[tx][ty]=; //标记这儿我已走过了。
dfs(tx,ty,now+,step+); //步数加一,秒数加一
book[tx][ty]=; //回溯
}
dfs(x,y,now,step+); //就是这一秒我不走。
return;
}
int main()
{
scanf("%d %d",&startx,&starty);
scanf("%d %d",&endx,&endy);
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%c\n",&t);
way[i]=getnum(t); //将每一秒的风向储存好。
}
dfs(startx,starty,,);
if(ans==) //如果ans还是999999,就说明到不了。
{
puts("-1");
}
else
{
printf("%d",ans);
}
return ;
}
DFS
洛谷 P2689 东南西北【模拟/搜索】的更多相关文章
- 洛谷P2689 东南西北
https://www.luogu.org/problemnew/show/P2689 #include<iostream> #include<algorithm> using ...
- 洛谷 2921 记忆化搜索 tarjan 基环外向树
洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)
洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...
- AC日记——导弹拦截 洛谷 P1020 (dp+模拟)
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- AC日记——潜伏者 洛谷 P1071 (模拟)
题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...
- 洛谷P2329 栅栏 [SCOI2005] 搜索
正解:搜索 解题报告: 先放下传送门! 首先说下爆搜趴,就直接枚每个需求是否被满足以及如果满足切哪个板子,随便加个最优性剪枝,似乎是有80pts 然后思考优化 首先显然尽量满足需求比较小的,显然如果能 ...
- 洛谷P1528 切蛋糕 [搜索,二分答案]
题目传送门 切蛋糕 题目描述 Facer今天买了n块蛋糕,不料被信息组中球球等好吃懒做的家伙发现了,没办法,只好浪费一点来填他们的嘴巴.他答应给每个人留一口,然后量了量每个人口的大小.Facer有把刀 ...
- 洛谷P3952 时间复杂度(模拟)
题意 题目链接 Sol 咕了一年的题解..就是个模拟吧 考场上写的递归也是醉了... 感觉一年自己进步了不少啊..面向数据编程的能力提高了不少 #include<bits/stdc++.h> ...
随机推荐
- 【bzoj4070】[Apio2015]雅加达的摩天楼 set+堆优化Dijkstra
题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 “doge” 的神秘生物 ...
- C#的23种设计模式概括
创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) ...
- 【转】IBatis.Net项目数据库SqlServer迁移至Oracle
转自:http://www.2cto.com/database/201312/265514.html 最近完成了一个(IBatis.Net+MVC)项目的数据库+代码迁移工作,可把我折腾得~~~ IB ...
- 【题解】HAOI2008木棍分割
对于这道题目的两问,第一问直接二分答案求出最短长度.关键在于第二问应当如何求:建立dp方程,dp[i][j]代表到第i个分界线,切了j次(强制在第i处切一刀.这样就不会对后面的状态产生影响).状态转移 ...
- 谈一谈深度学习之semantic Segmentation
上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...
- poj 2104 (划分树模板)
Description You are working for Macrohard company in data structures department. After failing your ...
- Prepare and Deploy Windows Server 2016 Active Directory Federation Services
https://docs.microsoft.com/en-us/windows/security/identity-protection/hello-for-business/hello-key-t ...
- Java并发编程--ThreadPoolExecutor
概述 为什么要使用线程池? 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立 ...
- AOP编程的常用实现方式
aop代理分为静态代理.jdk动态代理.cglib动态代理 通过动态代理的方式实现横向扩展,实现权限校验.日志等功能. jdk静态代理:代理类和委托类实现同一接口,并且在代理类中需要硬编码接口. jd ...
- WebComponents001
Sample1: ShadowDom 隔离style,替换显示内容 <button>Hello, world!</button> <script> var host ...