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;}

华为机试 第二题-速战速决相关推荐

  1. 华为机试第二题420 按照路径替换二叉树

    华为机试第二题 按照路径替换二叉树 文章目录 一.题目回忆 输入 样例一 二.Java代码 三.注意 一.题目回忆 将一颗子二叉树按照路径替换到另一棵根二 叉树中, 得到一颗新的二叉 树.替换动作满足 ...

  2. 【华为机试真题详解】高矮个子排队

    文章目录 前言 题目描述 示例 1 示例 2 示例 3 题目分析 参考代码 前言 <华为机试真题详解 Python实现>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备 ...

  3. 【华为机试真题详解】欢乐的周末

    文章目录 前言 题目描述 示例 1 示例 2 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会 ...

  4. 【华为机试真题 Python实现】欢乐的周末

    文章目录 前言 题目描述 示例 1 示例 2 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会 ...

  5. [华为机试真题]70.分苹果

    题目 M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放.1<=M<=10,1<=N<=10例如5个苹果三个篮子,3,1,1 和 1,1,3是同一种放法输入 7 3输出 ...

  6. [华为机试真题][2014]62.去除重复字符并排序

    题目 描述: 去除重复字符并排序 运行时间限制: 无限制 内容限制: 无限制 输入: 字符串 输出: 去除重复字符并排序的字符串 样例输入: aabcdefff 样例输出: abcdef 代码 /*- ...

  7. 华为机试二星题--机器人走迷宫

    题目 机器人走一个迷宫,给出迷宫的x和y(x*y的迷宫)并且迷宫中有障碍物,输入k表示障碍物有k个,并且会将障碍物的坐标挨个输入. 机器人从0,0的位置走到x,y的位置并且只能向x,y增加的方向走,不 ...

  8. 【华为机试真题 Python实现】查找众数及中位数

    文章目录 前言 题目描述 示例 1 示例 2 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会 ...

  9. 【华为机试真题详解】不含 101 的数【2022 Q4 | 100分】

    文章目录 前言 题目描述 输入描述 输出描述 示例 1 示例2 题目解析 参考代码 前言 <华为机试真题详解 Python实现>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果 ...

最新文章

  1. python+selenium百度贴吧自动签到
  2. 分享五款java学习辅助工具,总有你用的上的~
  3. p值+p-value+p value+显著性+significance
  4. c++ 和 C语言 中数组语法的比较
  5. java 怎么把list流化_Java 中的数据流和函数式编程
  6. JZOJ 5932. 【NOIP2018模拟10.27】情报中心
  7. sql server 2008学习2 文件和文件组
  8. SpringMVC的请求-文件上传-文件上传的原理
  9. 《软件设计精要与模式》推荐序三
  10. 英语学习app源码_无纸化英语学习APP击败%89英语学习者
  11. 基金学习201907301
  12. python面试技巧_经典7大Python面试题!看完考官竟然给了我30k的薪资
  13. FineReport层式报表解决大数据集展示问题攻略
  14. Mybatis配置信息浅析 MyBatis简介(二)
  15. 转 SPI和API的区别
  16. 配置和运行 MatchNet CVPR 2015 MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching...
  17. PHP+node搞一下58微聊的聊天内容的获取
  18. arg min什么意思
  19. SQL Server医疗信息管理系统数据库【英文版-源码】--(Medical Management System Database)
  20. 《瓦尔登湖》--- 读书笔记

热门文章

  1. Notepad++ 替换换行符
  2. 应用MIME将ZPT内容输出为excel文件(word文件)
  3. 《明解C语言》第九章字符串课后练习题
  4. 电子计算机设置时间,电脑设置年月日_电脑怎么设置年月日
  5. 一次 Young GC 的优化实践(FinalReference 相关)
  6. SpringBoot测试类不需要加@RunWith?
  7. 【Educational Codeforces Round 61 (Rated for Div. 2)】A.B.C.D.E.F.G
  8. 美国囤积零日漏洞的目的何在?
  9. axure原型怎么让文字自动换行_Axure动态面板教程(快速入门+轮播图案例)
  10. linux查询socket资源,TCP的socket资源被耗尽的问题