题目描述

给出起点和终点的坐标及接下来T个时刻的风向(东南西北),每次可以选择顺风偏移1个单位或者停在原地。求到达终点的最少时间。

如果无法偏移至终点,输出“-1”。

输入输出格式

输入格式:

第一行两个正整数x1,y1,表示小明所在位置。

第二行两个正整数x2,y2,表示小明想去的位置。

第三行一个整数T,表示T个时刻。

第四至第N+3行,每行一个字符,表示风向,即东南西北的英文单词的首字母。

输出格式:

最少走多少步。

输入输出样例

输入样例#1:

1 1
2 2
5
E
N
W
W
N
输出样例#1:

2
输入样例#2:

1 1
2 2
1
W
输出样例#2:

-1
输入样例#3:

1 1
2 2
3
W
W
W
输出样例#3:

-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 东南西北【模拟/搜索】的更多相关文章

  1. 洛谷P2689 东南西北

    https://www.luogu.org/problemnew/show/P2689 #include<iostream> #include<algorithm> using ...

  2. 洛谷 2921 记忆化搜索 tarjan 基环外向树

    洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...

  3. 洛谷P1074 靶形数独 [搜索]

    题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...

  4. 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)

    洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...

  5. AC日记——导弹拦截 洛谷 P1020 (dp+模拟)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  6. AC日记——潜伏者 洛谷 P1071 (模拟)

    题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...

  7. 洛谷P2329 栅栏 [SCOI2005] 搜索

    正解:搜索 解题报告: 先放下传送门! 首先说下爆搜趴,就直接枚每个需求是否被满足以及如果满足切哪个板子,随便加个最优性剪枝,似乎是有80pts 然后思考优化 首先显然尽量满足需求比较小的,显然如果能 ...

  8. 洛谷P1528 切蛋糕 [搜索,二分答案]

    题目传送门 切蛋糕 题目描述 Facer今天买了n块蛋糕,不料被信息组中球球等好吃懒做的家伙发现了,没办法,只好浪费一点来填他们的嘴巴.他答应给每个人留一口,然后量了量每个人口的大小.Facer有把刀 ...

  9. 洛谷P3952 时间复杂度(模拟)

    题意 题目链接 Sol 咕了一年的题解..就是个模拟吧 考场上写的递归也是醉了... 感觉一年自己进步了不少啊..面向数据编程的能力提高了不少 #include<bits/stdc++.h> ...

随机推荐

  1. 【bzoj4070】[Apio2015]雅加达的摩天楼 set+堆优化Dijkstra

    题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 “doge” 的神秘生物 ...

  2. C#的23种设计模式概括

    创建型:         1. 单件模式(Singleton Pattern)         2. 抽象工厂(Abstract Factory)         3. 建造者模式(Builder) ...

  3. 【转】IBatis.Net项目数据库SqlServer迁移至Oracle

    转自:http://www.2cto.com/database/201312/265514.html 最近完成了一个(IBatis.Net+MVC)项目的数据库+代码迁移工作,可把我折腾得~~~ IB ...

  4. 【题解】HAOI2008木棍分割

    对于这道题目的两问,第一问直接二分答案求出最短长度.关键在于第二问应当如何求:建立dp方程,dp[i][j]代表到第i个分界线,切了j次(强制在第i处切一刀.这样就不会对后面的状态产生影响).状态转移 ...

  5. 谈一谈深度学习之semantic Segmentation

    上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...

  6. poj 2104 (划分树模板)

    Description You are working for Macrohard company in data structures department. After failing your ...

  7. 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 ...

  8. Java并发编程--ThreadPoolExecutor

    概述 为什么要使用线程池? 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立 ...

  9. AOP编程的常用实现方式

    aop代理分为静态代理.jdk动态代理.cglib动态代理 通过动态代理的方式实现横向扩展,实现权限校验.日志等功能. jdk静态代理:代理类和委托类实现同一接口,并且在代理类中需要硬编码接口. jd ...

  10. WebComponents001

    Sample1: ShadowDom 隔离style,替换显示内容 <button>Hello, world!</button> <script> var host ...