杭电oj(1180、1181)题解

 

目录

1180

题目

思路

问题概述

代码思路分析

1. 数据结构与全局变量

2. BFS 函数 bfs

3. 主函数 main

总结

代码

1181

题目

思路

1. 全局变量的定义

2. 深度优先搜索函数 dfs

3. 主函数 main

总结

代码


 

1180

题目

思路

注:当走的方向和楼梯方向一致的时候不用等楼梯

问题概述

存在一个由字符构成的迷宫,每个字符代表不同的地形。起点用 S 表示,终点用 T 表示,障碍物用 * 表示,还有两种特殊地形:竖杠 | 和横杠 -,它们会依据时间(步数)的奇偶性来改变通行规则。代码的目的是找出从起点到终点的最短步数。

代码思路分析

1. 数据结构与全局变量
char map[25][25];
bool val[25][25];
int n,m;
int dxy[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
struct node{int t;int x,y;
};

  • map:二维字符数组,用于存储迷宫地图。
  • val:二维布尔数组,用于标记某个位置是否已经被访问过。
  • n 和 m:分别代表迷宫的行数和列数。
  • dxy:二维数组,存储四个方向(上、右、下、左)的偏移量,便于后续遍历相邻位置。
  • node:结构体,用于存储当前位置的信息,包含时间 t 以及坐标 (x, y)
2. BFS 函数 bfs
int bfs(node temp){queue<node>q;while(!q.empty()){q.pop();}q.push(temp);while(!q.empty()){temp=q.front();q.pop();if(map[temp.x][temp.y]=='T') return temp.t;for(int i=0;i<4;i++){node next;next.x=temp.x+dxy[i][0];next.y=temp.y+dxy[i][1];next.t=temp.t+1;if(val[next.x][next.y] || map[next.x][next.y]=='*' || next.x<1 || next.x>n || next.y<1 || next.y>m) continue;if(map[next.x][next.y]=='|'){next.x+=dxy[i][0];next.y+=dxy[i][1];if(val[next.x][next.y] || map[next.x][next.y]=='*' || next.x<1 || next.x>n || next.y<1 || next.y>m) continue;if((temp.t%2==1 && dxy[i][1]==0) || (temp.t%2==0 && dxy[i][0]==0)) next.t++;}else if(map[next.x][next.y]=='-'){next.x+=dxy[i][0];next.y+=dxy[i][1];if(val[next.x][next.y] || map[next.x][next.y]=='*' || next.x<1 || next.x>n || next.y<1 || next.y>m) continue;if((temp.t%2==1 && dxy[i][0]==0) || (temp.t%2==0 && dxy[i][1]==0)) next.t++;}val[next.x][next.y]=true;q.push(next);}}
}

  • 初始化一个队列 q,并将起点加入队列。
  • 持续从队列中取出元素,若当前位置为终点 T,则返回当前的时间 t
  • 遍历当前位置的四个相邻位置:
    • 若相邻位置已被访问、是障碍物或者越界,则跳过。
    • 若相邻位置是 | 或 -,需要额外处理:
      • 先跨过该位置,检查新位置是否合法。
      • 根据当前时间的奇偶性以及移动方向,判断是否需要额外增加时间。
    • 标记新位置为已访问,并将其加入队列。
3. 主函数 main
int main(){while(cin>>n>>m){node sta;memset(val, false, sizeof(val));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>map[i][j];if(map[i][j]=='S'){val[i][j]=true;sta.t=0;sta.x=i;sta.y=j;}}}cout<<bfs(sta)<<endl;}return 0;
}

  • 持续读取迷宫的行数和列数。
  • 初始化 val 数组为 false,表示所有位置都未被访问。
  • 读取迷宫地图,找到起点 S,并标记起点为已访问。
  • 调用 bfs 函数进行搜索,并输出最短步数。

总结

此代码运用 BFS 算法,从起点开始逐层扩展,直至找到终点。在扩展过程中,针对特殊地形 | 和 -,依据时间的奇偶性和移动方向来决定是否需要额外增加时间,最终输出从起点到终点的最短步数。

代码

#include<iostream>
#include<queue> 
using namespace std;
char map[25][25];
bool val[25][25];
int n,m;
int dxy[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
struct node{int t;int x,y;
};int bfs(node temp){queue<node>q;while(!q.empty()){q.pop();}q.push(temp);while(!q.empty()){temp=q.front();q.pop();if(map[temp.x][temp.y]=='T') return temp.t;for(int i=0;i<4;i++){node next;next.x=temp.x+dxy[i][0];next.y=temp.y+dxy[i][1];next.t=temp.t+1;if(val[next.x][next.y] || map[next.x][next.y]=='*' || next.x<1 || next.x>n || next.y<1 || next.y>m) continue;if(map[next.x][next.y]=='|'){next.x+=dxy[i][0];next.y+=dxy[i][1];if(val[next.x][next.y] || map[next.x][next.y]=='*' || next.x<1 || next.x>n || next.y<1 || next.y>m) continue;if((temp.t%2==1 && dxy[i][1]==0) || (temp.t%2==0 && dxy[i][0]==0)) next.t++;}else if(map[next.x][next.y]=='-'){next.x+=dxy[i][0];next.y+=dxy[i][1];if(val[next.x][next.y] || map[next.x][next.y]=='*' || next.x<1 || next.x>n || next.y<1 || next.y>m) continue;if((temp.t%2==1 && dxy[i][0]==0) || (temp.t%2==0 && dxy[i][1]==0)) next.t++;}val[next.x][next.y]=true;q.push(next);}}
}
int main(){while(cin>>n>>m){node sta;memset(val, false, sizeof(val));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>map[i][j];if(map[i][j]=='S'){val[i][j]=true;sta.t=0;sta.x=i;sta.y=j;}}}cout<<bfs(sta)<<endl;}return 0;
}

1181

题目

思路

核心思路:将所有满足条件的情况放到动态数组中,如果数组为空输出no否则输出yes

这段 C++ 代码的核心思路是利用深度优先搜索(DFS)算法来判断输入的字符串集合中是否存在以 'b' 开头且以 'm' 结尾的字符串序列,并且序列中相邻字符串满足前一个字符串的最后一个字符与后一个字符串的第一个字符相同。下面为你详细剖析代码思路:

1. 全局变量的定义

vector<vector<string>> allSequences;
vector<string> ans;
vector<bool> val;
vector<string> arr;

  • allSequences:这是一个二维向量,用于存储所有满足条件(以 'b' 开头且以 'm' 结尾,相邻字符串首尾字符匹配)的字符串序列。
  • ans:这是一个一维向量,用于存储当前正在搜索的字符串序列。
  • val:这是一个布尔类型的向量,其长度与输入的字符串数量相同,用于标记每个字符串在当前搜索路径中是否已经被使用过。
  • arr:这是一个一维向量,用于存储所有输入的字符串。

2. 深度优先搜索函数 dfs

void dfs(string s) {if (s[s.size() - 1] == 'm') {allSequences.push_back(ans);return;}for (int i = 0; i < arr.size(); i++) {if (s[s.size() - 1] == arr[i][0] && val[i] == false) {val[i] = true;ans.push_back(arr[i]);dfs(arr[i]);val[i] = false;ans.pop_back();}}
}

  • 终止条件:当当前字符串 s 的最后一个字符是 'm' 时,意味着找到了一个满足条件的字符串序列,将当前的 ans 序列添加到 allSequences 中,然后返回。
  • 搜索过程
    • 遍历 arr 中的每个字符串。
    • 检查当前字符串 s 的最后一个字符是否等于 arr[i] 的第一个字符,并且 arr[i] 还未被使用过(即 val[i] 为 false)。
    • 如果满足条件,将 arr[i] 标记为已使用(val[i] = true),并将其添加到 ans 序列中。
    • 递归调用 dfs 函数,继续以 arr[i] 为当前字符串进行搜索。
    • 递归返回后,进行回溯操作,将 arr[i] 标记为未使用(val[i] = false),并从 ans 序列中移除。

3. 主函数 main

int main() {string s;while (true) {arr.clear();allSequences.clear();while (cin >> s) {if (s == "0") break;arr.push_back(s);}if (arr.empty()) break;val.assign(arr.size(), false);for (int i = 0; i < arr.size(); i++) {if (arr[i][0] == 'b') {ans.clear();ans.push_back(arr[i]);val[i] = true;dfs(arr[i]);val[i] = false;}}if(!allSequences.empty()) cout<<"Yes."<<endl;else cout<<"No."<<endl;}return 0;
}

  • 输入处理
    • 持续读取输入的字符串,直到遇到 "0" 为止,将这些字符串存储在 arr 中。
    • 如果 arr 为空,说明没有输入有效字符串,程序结束。
  • 初始化标记数组:将 val 数组的所有元素初始化为 false,表示所有字符串都未被使用。
  • 启动搜索
    • 遍历 arr 中的每个字符串,若其以 'b' 开头,则将其作为起始字符串,清空 ans 并将该字符串添加到 ans 中,标记其为已使用,然后调用 dfs 函数开始搜索。
    • 搜索结束后,将该字符串标记为未使用,以便后续可能的其他搜索路径使用。
  • 输出结果
    • 如果 allSequences 不为空,说明找到了满足条件的字符串序列,输出 "Yes."
    • 否则,输出 "No."

总结

该代码通过深度优先搜索算法,从以 'b' 开头的字符串开始,不断尝试寻找满足首尾字符匹配条件且以 'm' 结尾的字符串序列,最终根据是否找到这样的序列输出相应的结果。

代码

#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<vector<string>> allSequences;
vector<string> ans;
vector<bool> val;
vector<string> arr;void dfs(string s) {if (s[s.size() - 1] == 'm') {allSequences.push_back(ans);return;}for (int i = 0; i < arr.size(); i++) {if (s[s.size() - 1] == arr[i][0] && val[i] == false) {val[i] = true;ans.push_back(arr[i]);dfs(arr[i]);val[i] = false;ans.pop_back();}}
}int main() {string s;while (true) {arr.clear();allSequences.clear();while (cin >> s) {if (s == "0") break;arr.push_back(s);}if (arr.empty()) break;val.assign(arr.size(), false);for (int i = 0; i < arr.size(); i++) {if (arr[i][0] == 'b') {ans.clear();ans.push_back(arr[i]);val[i] = true;dfs(arr[i]);val[i] = false;}}if(!allSequences.empty()) cout<<"Yes."<<endl;else cout<<"No."<<endl;}return 0;
}    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试概念

这里写目录标题 需求开发模型软件生命周期瀑布模型螺旋模型增量模型、迭代模型敏捷模型Scrum 测试模型V模型W模型&#xff08;双V模型&#xff09; 需求 用户需求&#xff1a;没有经过合理的评估&#xff0c;通常就是一句话 软件需求&#xff1a;是开发人员和测试人员执行工作…

数字基带信号和频带信号的区别解析

数字基带信号和数字频带信号是通信系统中两种不同的信号形式&#xff0c;它们的核心区别在于是否经过调制以及适用的传输场景。以下是两者的主要区别和分析&#xff1a; 1. 定义与核心区别 数字基带信号&#xff08;Digital Baseband Signal&#xff09; 未经调制的原始数字信号…

Linux52 运行百度网盘 解决故障无法访问repo nosandbox 未解决:疑似libstdc++版本低导致无法运行baidu网盘

昨日参考 哦 我是root Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 没了 计划去手动下一个 还是不行 放弃 猜测是 centos7 过期了 一些依赖组件也没地方下载了 通过阿里云镜像站下载 之前安装的好像不是这个版本 还是计划用yum去下载依赖&#xff0c;先处…

2000-2022年上市公司数字经济专利申请数据

2000-2022年上市公司数字经济专利申请数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;国家知识产权局 3、指标&#xff1a;年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、数字经济…

机器学习之五:基于解释的学习

正如人们有各种各样的学习方法一样&#xff0c;机器学习也有多种学习方法。若按学习时所用的方法进行分类&#xff0c;则机器学习可分为机械式学习、指导式学习、示例学习、类比学习、解释学习等。这是温斯顿在1977年提出的一种分类方法。 有关机器学习的基本概念&#xff0c;…

Chromium 134 编译指南 - Android 篇:安装构建依赖项(七)

1. 引言 欢迎来到《Chromium 134 编译指南》系列的第七篇文章&#xff01;在前面的章节中&#xff0c;我们已经成功获取了Chromium源代码&#xff0c;并将其配置为支持Android平台。这些步骤为我们的编译之旅奠定了坚实的基础&#xff0c;但在开始实际编译之前&#xff0c;我们…

java 进阶 1.0

静态方法 static 就是能直接用&#xff0c;不用再new一个对象了 一般java中Math等静态类就是可以直接使用其方法 main函数里面不能包含太多的逻辑性语句&#xff0c;全部写成模块 写好程序之后如何测试呢&#xff1f; 使用junit&#xff0c;不能在main函数里测试 测试本身就…

中小企业MES系统详细设计

版本&#xff1a;V1.1 日期&#xff1a;2025年5月2日 一、设备协议兼容性设计 1.1 设备接入框架 #mermaid-svg-PkwqEMRIIlIBPP58 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PkwqEMRIIlIBPP58 .error-icon{fill…

Spring Security会话管理

用户认证通过后&#xff0c;为了避免用户的每次操作都进行认证&#xff0c;可以将用户的信息保存在会话中。会话就是系统为了保持当前用户的登录状态所提供的机制&#xff0c;常见的有基于Session方式、基于Token方式等。Spring Security提供会话管理功能&#xff0c;只需要配置…

PostgreSQL数据库操作基本命令

常用操作sql &#x1f510; 用户管理 -- 创建用户 CREATE USER username WITH PASSWORD password;-- 修改用户密码 ALTER USER username WITH PASSWORD newpassword;-- 删除用户 DROP USER username;&#x1f4e6; 数据库操作 -- 创建数据库 CREATE DATABASE dbname;-- 删除…

[吾爱出品] 网文提取精灵_4.0

网文提取精灵 链接&#xff1a;https://pan.xunlei.com/s/VOPDvKljcT3EWLjpt5LeDZvfA1?pwdw8kq# 易语言写的&#xff0c;介意的不要下载 相对网文提取工具_2.10.02版&#xff0c;因为是重写界面&#xff0c;目前版本限制最高5线程&#xff0c;暂时不支持批处理。 虽然不支…

每日算法-250502

每日算法 - 2025.05.02 记录一下今天刷的几道 LeetCode 算法题。 3191. 使二进制数组全部等于 1 的最少操作次数 I 题目 思路 贪心 解题过程 遍历数组 nums。当我们遇到 nums[i] 时&#xff1a; 如果 nums[i] 是 1&#xff0c;我们不需要进行操作&#xff0c;因为目标是全 …

移动端开发中设备、分辨率、浏览器兼容性问题

以下是针对移动端开发中设备、分辨率、浏览器兼容性问题的 系统化解决方案&#xff0c;按开发流程和技术维度拆解&#xff0c;形成可落地的执行步骤&#xff1a; 一、基础环境适配&#xff1a;从「起点」杜绝兼容性隐患 1. Viewport 元标签标准化 <meta name"viewpor…

2025最新AI绘画系统源码 - 画图大模型/GPT-4全支持/AI换脸/自定义智能体

在AI绘画技术日新月异的2025年&#xff0c;比象AI绘画系统源码以其突破性的技术创新重新定义了数字艺术创作的边界。作为第四代AI绘画引擎&#xff0c;我们不仅集成了最先进的GPT-4o多模态画图模型&#xff0c;实现了从基础文生图到专业级艺术创作的全面进化。本系统源码经过多…

构造函数详解

构造函数的作用 构造函数的主要任务是初始化对象&#xff0c;而不是创建对象&#xff08;对象的内存空间在构造函数被调用前已经分配好&#xff09;。 构造函数特性 命名规则&#xff1a;函数名必须与类名完全相同。 返回值&#xff1a;构造函数没有返回值类型&#xff08;连…

jaffree 封装ffmpeg 转换视频格式,获取大小,时间,封面

下载 参考网址 【收藏级教程】FFmpeg音视频处理宝典&#xff1a;从入门到精通的50个实用技巧_ffmpeg教程-CSDN博客 配置环境变量 验证 重启idea开发工具 springboot maven集成 <dependency><groupId>com.github.kokorin.jaffree</groupId><artifactId&…

2505C++,wmi客户端示例

原文 #define _WIN32_DCOM #include <iostream> using namespace std; #include <comdef.h> #include <Wbemidl.h> #pragma comment(lib, "wbemuuid.lib") int main(int argc, char **argv) {HRESULT hres;//初化COM.hres CoInitializeEx(0, CO…

[面试]SoC验证工程师面试常见问题(三)

SoC验证工程师面试常见问题(三) 在 SoC 验证工程师的面试中,面试官可能会要求候选人现场编写 SystemVerilog、UVM (Universal Verification Methodology) 或 SystemC 代码,以评估其编程能力、语言掌握程度以及解决实际验证问题的能力。这种随机抽题写代码的环节通常…

HTML5+JavaScript实现连连看游戏之二

HTML5JavaScript实现连连看游戏之二 以前一篇&#xff0c;见 https://blog.csdn.net/cnds123/article/details/144220548 连连看游戏连接规则&#xff1a; 只能连接相同图案&#xff08;或图标、字符&#xff09;的方块。 连线路径必须是由直线段组成的&#xff0c;最多可以有…

《深入浅出Git:从版本控制原理到高效协作实战》​

Git的原理和使用 1、Git初识与安装2、Git基本操作2.1、创建Git本地仓库2.2、配置Git2.3、认识工作区、暂存区、版本库2.4、修改文件2.5、版本回退2.6、撤销修改2.7、删除文件 3、Git分支管理3.1、理解分支3.2、创建、切换、合并分支3.3、删除分支3.4、合并冲突3.5、合并模式3.6…