第五届上海市青少年算法竞赛 T6 位置互换(广度优先搜索)

第六题:T6位置互换

标签:广度优先搜索
题意:给定一个矩形地图,地图中 . . .代表可以走的空地; # \# #代表不可以走的墙壁; 1 1 1表示小爱初始的位置; 2 2 2表示小艾初始的位置。小爱和小艾可以上下左右走或原地不动,不可以移动到对方当前的位置,求经过多少轮之后,小爱和小艾可以实现互换位置。
题解:把小爱和小艾的整体移动跑 b f s bfs bfs,开个四维 v i s vis vis数组标记一下各自走同步的情况,进行位移的过程中需要把各自 4 4 4个方向,即 4 4 4x 4 4 4种情况都跑一下。跑 b f s bfs bfs的过程中需要注意几个细节:

  1. 如果小爱或者小艾某个人已经跑到对应互换的终点了,就原地保持不动。
  2. 如果发生了当前跑到的两个位置互换的情况,要跳过。比如小爱在 ( 2 , 2 ) (2,2) (2,2)位置要往右走到 ( 2 , 3 ) (2,3) (2,3);小艾在 ( 2 , 3 ) (2,3) (2,3)位置要往左走到 ( 2 , 3 ) (2,3) (2,3)
  3. 移动到同一个格子的时候,需要让其中一个人原地不动,另一个人走到这个各自上。

整道题细节比较多和需要考虑的点比较多,同学们在写的过程中要注意细节的处理。
代码

#include <bits/stdc++.h>
using namespace std;struct node {// 当前小爱坐标(x1,y1) 小艾坐标(x2,y2) 步数int x1, y1, x2, y2, step;
}st;
int n, m;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
char a[50][50];
bool vis[50][50][50][50];bool check(int x, int y) {return x >= 1 && x <= n && y >= 1 && y <= m && a[x][y] != '#';
}void bfs() {queue<node> q;q.push(st);vis[st.x1][st.y1][st.x2][st.y2] = 1;while (!q.empty()) {node p = q.front();q.pop();if (p.x1 == st.x2 && p.y1 == st.y2 && p.x2 == st.x1 && p.y2 == st.y1) {cout << p.step;return ;}// 枚举小爱和小艾的所有方向组合for (int i = 0; i < 4; i++)for (int j = 0; j < 4; j++) {int nx1 = p.x1 + dx[i], ny1 = p.y1 + dy[i];int nx2 = p.x2 + dx[j], ny2 = p.y2 + dy[j];if (nx1 == p.x2 && ny1 == p.y2 && nx2 == p.x1 && ny2 == p.y1) continue;// 如果已经到终点, 原地保持不动if (p.x1 == st.x2 && p.y1 == st.y2) nx1 = p.x1, ny1 = p.y1;if (p.x2 == st.x1 && p.y2 == st.y1) nx2 = p.x2, ny2 = p.y2;if (check(nx1, ny1) && check(nx2, ny2)) {if (nx1 == nx2 && ny1 == ny2) { // 移动到同一个格子的情况if (!vis[nx1][ny1][p.x2][p.y2]) {vis[nx1][ny1][p.x2][p.y2] = 1;q.push({nx1, ny1, p.x2, p.y2, p.step + 1});}if (!vis[p.x1][p.y1][nx2][ny2]) {vis[p.x1][p.y1][nx2][ny2] = 1;q.push({p.x1, p.y1, nx2, ny2, p.step + 1});}} else { // 不是移动到同一个格子的情况if (!vis[nx1][ny1][nx2][ny2]) {vis[nx1][ny1][nx2][ny2] = 1;q.push({nx1, ny1, nx2, ny2, p.step + 1});}}}}}cout << "No Solution";
}int main() {cin >> n >> m;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) {cin >> a[i][j];if (a[i][j] == '1') st.x1 = i, st.y1 = j;if (a[i][j] == '2') st.x2 = i, st.y2 = j;}bfs();return 0;
}

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

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

相关文章

k8s:通过nodeSelector将pod调度到含有指定标签的结点上

一、查看node,并给node打标签 二、在资源清单文件中配置nodeSelector来指定要往满足哪个标签条件的结点进行调度 apiVersion: v1 kind: Pod metadata:name: probe-tcp spec:containers:- name: nginximage: nginxlivenessProbe:initialDelaySeconds: 5timeoutSeconds: 5tcpSo…

宝塔面板使用docker+nginx+gunicorn部署Django项目实战教程

第一步&#xff1a;创建Django项目 使用pip install django安装创建django项目的依赖在电脑某个根目录下执行django-admin startproject app创建一个名为app的Django项目。目录结构如下: ├── app │ ├── init.py │ ├── asgi.py │ ├── settings.py │ ├── url…

【海思Hi3516CV610】是面向新一代视频编解码标准、网络安全和隐私保护、人工智能行业应用方面的IPC SoC

海思Hi3516CV610是面向新一代视频编解码标准、网络安全和隐私保护、人工智能行业应用方面的IPC SoC&#xff0c;除了开发普通摄像机&#xff0c;还可以打造极具竞争力的枪球一体机、双目长短焦摄像机产品&#xff1b; 处理器内核: 支持ARM Cortex-A7 MP2 时钟速率950MHz 支持…

90年代女神返港行李失踪 怒斥国泰航空

现年51岁的童爱玲在1993年拍摄电影《火蝴蝶》入行&#xff0c;外形出众的她当年曾与梁朝伟、黎明等男神合作&#xff0c;因而被封为「男神磁石」。虽然童爱玲与台湾富商王敦民结婚诞下一子后&#xff0c;便淡出演艺圈&#xff0c;但她曾在2022年复出拍摄ViuTV剧集《季前赛》&am…

探索MATLAB在计算机视觉与深度学习领域的实战应用

随着人工智能技术的快速发展&#xff0c;计算机视觉与深度学习已成为科技领域中最热门、最具挑战性的研究方向之一。 它们的应用范围从简单的图像处理扩展到了自动驾驶、医疗影像分析、智能监控行业等多个领域。 在这样的背景下&#xff0c;《MATLAB计算机视觉与深度学习实战…

3D开发工具HOOPS助力CAM软件优化制造流程

在现代制造业中&#xff0c;计算机辅助制造&#xff08;CAM&#xff09;软件的发展已成为提高生产效率和产品质量的关键。为了满足不断增长的需求和日益复杂的制造流程&#xff0c;CAM软件需要具备高效的CAD数据导入、云端协作、移动应用支持以及丰富的文档生成能力。 Tech So…

nginx installed inLinux

yum install nginx [rootmufeng ~]# yum install nginx CentOS系列&#xff1a;【Linux】CentOS7操作系统安装nginx实战&#xff08;多种方法&#xff0c;超详细&#xff09; ———————————————— 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC …

FPGA_verilog语法整理

FPGA_verilog语法整理 verilog的逻辑值 verilog的常数表达 位宽中指定常数的宽度&#xff08;表示成二进制数的位数&#xff09;&#xff0c;单引号加表示该常数为几进制的底数符号。 二进制底数符号为b&#xff0c;八进制为 o&#xff0c;十进制为d&#xff0c;十六进制为 h…

Kimichat用于学习教育场景的7种高级方法

●AI作为导师 你是一个乐观、鼓励学生的导师&#xff0c;通过解释观点和问学生问题来帮助学生理解概念。下面每一步只一步步的执行&#xff0c;不要全部执行。 #向学生介绍自己&#xff0c;作为他们的AI导师&#xff0c;很高兴帮助他们解答任何问题。一次只问一个问题。 #首…

sqli-labs靶场学习(一)

一.知识点 1.数据库 数据库是一个用于存储和管理数据的仓库。数据按照特定的格式存储&#xff0c;可以对数据库中的数据进行增加、修改、删除和查询操作。数据库的本质是一个文件系统&#xff0c;按照一定的逻辑结构组织数据&#xff0c;以方便高效地访问和维护。 2.数据库管…

光伏无人机勘探技术应用分析

光伏无人机勘探与传统勘探想必&#xff0c;具有智能化作业、测控精度高、环境适应性强等明显优势&#xff1b;卫星勘探辅助其能更快速甚至实时完成测绘拼图&#xff1b;在进行勘察时&#xff0c;可根据需要自由更换机载设备&#xff1b;自动诗经建模使数据更直观&#xff0c;工…

深度学习每周学习总结P5(运动鞋识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 –来自百度网盘超级会员V5的分享 目录 0. 总结1. 数据导入及处理部分2. 加载数据集3.模型构建部分3.1 模型构建3.2 公式推导 4. 设置超参…

Web开发:ASP.NET CORE的前端demo(纯前端)

目录 一、建立项目 二、删除无用文件 三、样式添加 四、写一个登录页面 五、登录主界面 一、建立项目 二、删除无用文件 三、样式添加 将你的图片资源添加在wwwroot下方&#xff0c;例如pics/logo.png 四、写一个登录页面 将Privacy.cshtml改为 Forget.cshtml &#xff0…

【数学】深度学习中的概率基础知识记录

基于 Deep Learning (2017, MIT) 书总结了必要的概率知识 原blog 以及用到的Ipython notebook 文章目录 1 概述2 知识2.1 离散变量和概率质量函数&#xff08;PMF&#xff09;2.2 连续变量和概率密度函数&#xff08;PDF&#xff09;2.3 边缘概率2.4 条件概率2.5 条件概率的链式…

阿里云ECS服务器安装docker

首先查看阿里云ECS的服务器的版本 cat /etc/redhat-release如果是Alibaba Cloud Linux release 3,请执行以下命令 添加docker-ce的dnf源。 sudo dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Alibaba Cloud Linux 3专…

MongoDB 索引全攻略

目录 一、索引介绍 1.1 单字段索引 1.2 复合索引 1.3 多键索引 1.4 主键索引 1.5 TTL 索引 1.6 地理空间索引 1.7 哈希索引 1.8 创建索引时注意事项 1.9 索引效果查看 二、索引实现原理 2.1 为什么使用 B-Tree 三、执行计划 一、索引介绍 任何数据库都有索引这一核心功能&…

Yolov8项目实践——基于yolov8与OpenCV实现目标物体运动热力图

概述 在数据驱动和定位的世界中&#xff0c;对数据进行解释、可视化和决策的能力变得日益重要。这表明&#xff0c;使用正确的工具和技术可能是项目成功的关键。在计算机视觉领域&#xff0c;存在许多技术来解释从视频&#xff08;包括录像、流媒体或实时视频&#xff09;中获…

SpringMVC核心流程解析

SpringMVC核心流程解析 DispatcherServlet的继承关系请求流程分析获取HandlerChain(ControllrtMethod拦截器)获取HandlerAdapter handlerMappings的初始化过程 DispatcherServlet的继承关系 DispatcherServlet本质是一个servlet&#xff0c;既然是servlet&#xff0c;一个请求…

[Algorithm][滑动窗口][水果成篮][最大连续的一个数 Ⅲ][将x减到0的最小操作数]详细讲解

目录 1.水果成篮1.题目链接2.算法原理讲解3.代码讲解 2.找到字符串中所有字母异位词1.题目链接2.算法原理讲解3.代码实现 3.串联所有单词的字串1.题目链接2.算法原理讲解3.代码实现 3.最小覆盖字串1.题目链接2.算法原理讲解 1.水果成篮 1.题目链接 水果成篮 2.算法原理讲解 …

Java集合进阶——数据结构

1.栈 模型&#xff1a; 栈模型和一个杯子差不多&#xff0c;一端开口&#xff0c;一端封闭&#xff0c;开口的那端叫栈顶&#xff0c;封闭的那端叫栈底&#xff0c;如图所示 介绍&#xff1a; 元素进入栈中叫进栈/压栈&#xff0c;元素出来叫出栈&#xff0c;元素进栈后会先来…