华为机试 第二题-速战速决
9月7号 第二题速战速决
虽然g了,但还是写出了,差一点啊,难过。
#include <algorithm>
#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <string>using namespace std;vector<vector<bool>> visited;
int min_time = INT32_MAX;
vector<pair<int, int>> off_set {{0, -1}, {-1, 0}, {0, 1}, {1, 0}};bool ischange(vector<vector<char>> &streets, int r1, int c1, int r2, int c2, int op) {//op == 1 遂平//op == 0 竖直if (op == -1)false;if (op == 0 && r1 == r2)return true;if (op == 1 && c1 == c2)return true;return false;}void dfs(vector<vector<char>> &streets, int row, int colum, int time, int op) {cout << time << endl;if (streets[row][colum] == 'E') {min_time = min(min_time, time);return ;}for (auto &off : off_set) {int r = row + off.first;int c = colum + off.second;if (r < 0 || r >= streets.size() || c < 0 || c >= streets[0].size() ) {continue;}if (visited[r][c])continue;if (streets[r][c] == 'X')continue;visited[r][c] = true;bool changed = ischange(streets, row, colum, r, c, op);int new_op;if (changed && op == 1)new_op = 0;else if (changed && op == 0) new_op = 1;else if (op == -1 && r > 1)new_op = 0;else if (op == -1 && c > 1)new_op = 1;elsenew_op = op;dfs(streets, r, c, (changed ? time+2 : time+1), new_op);visited[r][c] = false;}
}int main() {int M;int N;cin >> M >> N;vector<vector<char>> streets(M, vector<char>(N));for (int i = 0; i < M; ++i) {for (int j = 0; j < N; ++j) {cin >> streets[i][j];}}for (int i = 0; i < M; ++i) {for (int j = 0; j < N; ++j) {cout << streets[i][j] << " ";}cout << endl;}visited = vector<vector<bool>>(M, vector<bool>(N, false));int r;int c;for (int i = 0; i < M; ++i) {for (int j = 0; j < N; ++j) {if (streets[i][j] == 'S') {r = i;c = j;break;}}}dfs(streets, r, c, 0, -1);if (min_time == INT32_MAX)cout << -1 << endl;elsecout << min_time << endl;return 0;}
反思一下:
1.出现段错的时候应该,抓紧启动调试,而不是傻傻的进行静态分析。
2.要先处理越界,再处理特殊情况
3.|| 运算符是全部都试一遍的,这跟&& 不同。
更新:时间复杂度更低的解法
//dfs+记忆化搜索
#include <algorithm>
#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <string>using namespace std;vector<vector<bool>> visited;
vector<vector<int>> g_catch;
vector<pair<int, int>> off_set {{0, -1}, {-1, 0}, {0, 1}, {1, 0}};bool ischange(vector<vector<char>> &streets, int r1, int c1, int r2, int c2, int op) {//op == 1 遂平//op == 0 竖直if (op == -1)false;if (op == 0 && r1 == r2)return true;if (op == 1 && c1 == c2)return true;return false;}//将dfs的返回值定义为到达E所在街区的最小时间
int dfs(vector<vector<char>> &streets, int row, int colum, int op) {cout << row << " " << colum << endl;if (streets[row][colum] == 'E') {return 0;}if (g_catch[row][colum] != -1)return g_catch[row][colum];int min_time = INT16_MAX;for (auto &off : off_set) {int r = row + off.first;int c = colum + off.second;if (r < 0 || r >= streets.size() || c < 0 || c >= streets[0].size() ) {continue;}if (visited[r][c])continue;if (streets[r][c] == 'X')continue;visited[r][c] = true;bool changed = ischange(streets, row, colum, r, c, op);int new_op;if (changed && op == 1)new_op = 0;else if (changed && op == 0) new_op = 1;else if (op == -1 && r > 1)new_op = 0;else if (op == -1 && c > 1)new_op = 1;elsenew_op = op;int t = dfs(streets, r, c, new_op);int needtime = changed ? t + 2 : t + 1;min_time = min(min_time, needtime);visited[r][c] = false;}g_catch[row][colum] = min_time;return min_time;}int main() {int M = 6;int N = 6;vector<vector<char>> streets {{'S', 'B', 'B', 'B', 'B', 'B'},{'B', 'X', 'X', 'X', 'X', 'B'},{'B', 'B', 'X', 'B', 'B', 'B'},{'X', 'B', 'B', 'X', 'X', 'B'},{'B', 'B', 'B', 'B', 'X', 'B'},{'B', 'B', 'X', 'B', 'E', 'B'}};visited = vector<vector<bool>>(M, vector<bool>(N, false));g_catch = vector<vector<int>>(M, vector<int>(N, -1));int r;int c;for (int i = 0; i < M; ++i) {for (int j = 0; j < N; ++j) {if (streets[i][j] == 'S') {r = i;c = j;break;}}}// cout << r << c << endl;int ans = dfs(streets, r, c, -1);if (ans == INT16_MAX)cout << -1 << endl;elsecout << ans << endl;return 0;}
华为机试 第二题-速战速决相关推荐
- 华为机试第二题420 按照路径替换二叉树
华为机试第二题 按照路径替换二叉树 文章目录 一.题目回忆 输入 样例一 二.Java代码 三.注意 一.题目回忆 将一颗子二叉树按照路径替换到另一棵根二 叉树中, 得到一颗新的二叉 树.替换动作满足 ...
- 【华为机试真题详解】高矮个子排队
文章目录 前言 题目描述 示例 1 示例 2 示例 3 题目分析 参考代码 前言 <华为机试真题详解 Python实现>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备 ...
- 【华为机试真题详解】欢乐的周末
文章目录 前言 题目描述 示例 1 示例 2 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会 ...
- 【华为机试真题 Python实现】欢乐的周末
文章目录 前言 题目描述 示例 1 示例 2 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会 ...
- [华为机试真题]70.分苹果
题目 M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放.1<=M<=10,1<=N<=10例如5个苹果三个篮子,3,1,1 和 1,1,3是同一种放法输入 7 3输出 ...
- [华为机试真题][2014]62.去除重复字符并排序
题目 描述: 去除重复字符并排序 运行时间限制: 无限制 内容限制: 无限制 输入: 字符串 输出: 去除重复字符并排序的字符串 样例输入: aabcdefff 样例输出: abcdef 代码 /*- ...
- 华为机试二星题--机器人走迷宫
题目 机器人走一个迷宫,给出迷宫的x和y(x*y的迷宫)并且迷宫中有障碍物,输入k表示障碍物有k个,并且会将障碍物的坐标挨个输入. 机器人从0,0的位置走到x,y的位置并且只能向x,y增加的方向走,不 ...
- 【华为机试真题 Python实现】查找众数及中位数
文章目录 前言 题目描述 示例 1 示例 2 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会 ...
- 【华为机试真题详解】不含 101 的数【2022 Q4 | 100分】
文章目录 前言 题目描述 输入描述 输出描述 示例 1 示例2 题目解析 参考代码 前言 <华为机试真题详解 Python实现>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果 ...
最新文章
- python+selenium百度贴吧自动签到
- 分享五款java学习辅助工具,总有你用的上的~
- p值+p-value+p value+显著性+significance
- c++ 和 C语言 中数组语法的比较
- java 怎么把list流化_Java 中的数据流和函数式编程
- JZOJ 5932. 【NOIP2018模拟10.27】情报中心
- sql server 2008学习2 文件和文件组
- SpringMVC的请求-文件上传-文件上传的原理
- 《软件设计精要与模式》推荐序三
- 英语学习app源码_无纸化英语学习APP击败%89英语学习者
- 基金学习201907301
- python面试技巧_经典7大Python面试题!看完考官竟然给了我30k的薪资
- FineReport层式报表解决大数据集展示问题攻略
- Mybatis配置信息浅析 MyBatis简介(二)
- 转	SPI和API的区别
- 配置和运行 MatchNet CVPR 2015 MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching...
- PHP+node搞一下58微聊的聊天内容的获取
- arg min什么意思
- SQL Server医疗信息管理系统数据库【英文版-源码】--(Medical Management System Database)
- 《瓦尔登湖》--- 读书笔记
热门文章
- Notepad++ 替换换行符
- 应用MIME将ZPT内容输出为excel文件(word文件)
- 《明解C语言》第九章字符串课后练习题
- 电子计算机设置时间,电脑设置年月日_电脑怎么设置年月日
- 一次 Young GC 的优化实践(FinalReference 相关)
- SpringBoot测试类不需要加@RunWith?
- 【Educational Codeforces Round 61 (Rated for Div. 2)】A.B.C.D.E.F.G
- 美国囤积零日漏洞的目的何在?
- axure原型怎么让文字自动换行_Axure动态面板教程(快速入门+轮播图案例)
- linux查询socket资源,TCP的socket资源被耗尽的问题