牛客算法周周练17 D题 - 刺客信条 C++
题目链接:https://ac.nowcoder.com/acm/contest/6607/D
Description
万物皆虚,万事皆允,玩过刺客信条的人对这句话应该都不会感到陌生
小A也是非常痴迷于这款游戏,正巧最近《刺客信条·奥德赛》发布了,然而其高昂的价格让小A苦恼不已
于是,小A只好重玩一次最经典的刺客信条2,来抚慰自己受伤的心灵
按照刺客信条2的剧情,艾吉奥需要前往威尼斯,从圣殿骑士手里夺取金苹果,然后前往罗马梵蒂冈刺杀教皇,拿取伊甸园神器“教皇权杖”
但是由于小A已经玩过很多次这个游戏了,他对剧情和地图了如指掌,现在已经轻而易举地拿到了金苹果,返回到了佛罗伦萨的庄园
接下来,小A就将操控艾吉奥从佛罗伦萨庄园出发,前往梵蒂冈,夺取教皇权杖。
在整个过程中,每经过一个建筑,都需要花费一定的时间,需要特别注意的是,由于圣母百花大教堂、圣马可大教堂、乔托钟楼都有众多圣殿骑士守护,经过这三个地方时,你需要花费100的时间
小A已经急不可耐地想要通关了,所以希望花费最少的时间到达梵蒂冈,请你帮他计算一下,从佛罗伦萨庄园到梵蒂冈,最快需要多少时间?
Input
第一行有两个整数,表示地图的行数n和列数m,地图为一个n×m的矩阵
接下来有n行,每行m个字符,每个字符是一个数字或大写字母,数字表示经过该建筑需要的时间,字母表示特定建筑(S表示佛罗伦萨的庄园,即起点;E表示梵蒂冈,即终点;A表示圣母百花大教堂;B表示圣马可大教堂;C表示乔托钟楼;A、B、C在每组数据中至多出现一次),每个字符或数字之间用空格分隔
为了降低游戏难度,小A特意调小了地图
0≤n,m≤30
Output
输出一个整数,从佛罗伦萨庄园到梵蒂冈的最小用时T
Sample Input
3 3
S A E
1 2 3
1 B 3
Sample Output
6
Solution
显然这是个BFS的题,不过如果只用普通队列是不行的,因为有特定建筑的存在,导致最短距离不一定用时最短。这里我们可以使用一下优先队列,每次拿出用时最短的那个点去更新,直到到达终点即可。
Code
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define ll long long
char f[31][31];
bool vis[31][31];
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
int n, m, q, sx, sy, ex, ey;
struct node
{int x, y, t;//t表示起点到达点(x,y)所花的时间node(int m_x = 0, int m_y = 0, int m_time = 0) :x(m_x), y(m_y), t(m_time) {}bool operator<(const node& a) const {return t > a.t;}
};
int bfs() {priority_queue<node> p;p.push(node(sx, sy, 0));while (!p.empty()){node temp = p.top();p.pop();if (vis[temp.x][temp.y]) continue;vis[temp.x][temp.y] = 1;int xx, yy;for (int i = 0; i < 4; i++) {xx = temp.x + dx[i];yy = temp.y + dy[i];if (xx == ex && yy == ey) return temp.t;if (xx >= 0 && yy >= 0 && xx < n && yy < m && vis[xx][yy] == 0) {if(f[xx][yy]=='A'||f[xx][yy]=='B'||f[xx][yy]=='C') p.push(node(xx, yy, temp.t + 100));else p.push(node(xx, yy, temp.t + int(f[xx][yy]-48)));}}}
}
int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >> m;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {vis[i][j] = 0;}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> f[i][j];if (f[i][j] == 'S') {sx = i; sy = j;}else if (f[i][j] == 'E') {ex = i; ey = j;}}}cout << bfs() << endl;return 0;
}
感觉有帮助的话,点个赞再走吧!
牛客算法周周练17 D题 - 刺客信条 C++相关推荐
- 牛客算法周周练2 B Music Problem(DP,抽屉原理,二进制拆分)
链接:https://ac.nowcoder.com/acm/contest/5203/B 来源:牛客网 题目描述 Listening to the music is relax, but for o ...
- 牛客网-小周的曲射炮
牛客网-小周的曲射炮(公式推导) 题目描述 小周最近在玩一款二战游戏,他因而对曲射炮的轨迹产生了很大的兴趣,但是在尝试计算后,小周发现这个问题并不是那么简单,他因而来请教你这位计算机高手,请你来帮帮他 ...
- 牛客网--蘑菇街2016研发工程师编程题
牛客网--蘑菇街2016研发工程师编程题 第一题: 搬圆桌 时间限制:1秒 空间限制:32768K 现在有一张半径为r的圆桌,其中心位于(x,y),现在他想把圆桌的中心移到(x1,y1).每次移动一步 ...
- 「解析」牛客网-华为机考企业真题 1-20
又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...
- 「解析」牛客网-华为机考企业真题 41-60
又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...
- 「解析」牛客网-华为机考企业真题 81-108
又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...
- 「解析」牛客网-华为机考企业真题 21-40
又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...
- 牛客网 Java 工程师能力评估 20 题 - 详解
牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...
- 牛客小白月赛16 小石的签到题(博弈)
牛客小白月赛16 小石的签到题 链接:https://ac.nowcoder.com/acm/contest/949/A来源:牛客网 题目描述 输入描述: 共一行,输入一个数 nnn . 输出描述: ...
最新文章
- SPSiteManager 2.3可以下载了
- matlab碎纸拼接相似函数,基于蒙特卡洛算法构建能量函数的碎纸图片拼接方法
- 深入理解Spark 2.1 Core (一):RDD的原理与源码分析
- time函数python_Python连载6-time包函数简介
- 弃用Java的终结器
- NX机制及绕过策略-ret2libc
- mysql数据库修改数据库名称_MySQL数据库之MySQL 修改数据库名称的一个新奇方法...
- ServiceLoader用法demo
- RQNOJ 140 分配时间:dp
- 费曼纪念日,霍金和蚁人下了一盘的“量子象棋”
- c语言程序 实现简单计算器功能,C语言实现简单计算器功能(2)
- 【通信原理】揭开傅里叶级数与傅里叶变换的神秘面纱
- 实现LZW字典压缩算法
- 高斯投影坐标转换正算参数
- Kurento应用开发指南(以Kurento 5.0为模板) 之四:示例教程 一对一视频呼叫
- 假设你有8个球,其中一个略微重一些,但是找出这个球的唯一方法是将两个球放在天平上对比。最少要称多少次才能找出这个较重的球?
- Spark RDD与Partion
- android图片上水印字体颜色,Android给图片添加文字和水印
- 博实结将在创业板上会:计划募资25亿元,周小强为实际控制人
- 区块链知识系列 - BTC和ETH的区别