蓝桥杯-路径之谜

2024-05-05 17:36
文章标签 路径 蓝桥 之谜

本文主要是介绍蓝桥杯-路径之谜,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

小明冒充X星球的骑士,进入了一个奇怪的城堡。城堡里面什么都没有,只有方形石头铺成的地面。
假设城堡的地面时n*n个方格。如下图所示。
在这里插入图片描述
按习俗,骑士要从西北角走到东南角。可以横向或者纵向移动,但是不能斜着走,也不能跳跃。没走到一个新方格,就要向正北方和正西方各射一箭。(城堡的西墙和北墙内各有n个靶子)同一个方格只允许经过一次。但不必走完所有的方格。如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?有时是可以的,比如上图中的例子。
本题的要求就是已知箭靶数字,求骑士的行走的路径(测试数据保证路径唯一)。

输入描述

第一行一个整数N(0≤N≤20),表示地面有N*N个方格。
第二行N个整数,空格分开,表示北边的箭靶上的数字(自西向东)
第二行N个整数,空格分开,表示西边的箭靶上的数字(自北向南)

输出描述

输出一行若干个整数,表示骑士路径。
为了方便表示,我们约定每一个小格子用一个数字代表,从西北角开始编号:0,1,2,3…
比如,上图中的方块编号为:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

样式输入

4
2 4 3 4
4 3 3 3

样例输出

0 4 5 1 2 3 7 11 10 9 13 14 15

题目分析

题目分析:
  本题是一个路径推断问题,需要根据已知的箭靶数字来推断骑士在城堡内的行走路径。
  首先,我们需要理解题目中的规则和要求。骑士从西北角走到东南角,每次移动到一个新的方格,都需要向正北方和正西方各射一箭。每个方格只能经过一次,且不需要走完所有的方格。
  根据输入描述,我们知道第一行输入是整数N,表示地面有NxN个方格。第二行是北边箭靶上的数字,表示自西向东的顺序。第三行是西边箭靶上的数字,表示自北向南的顺序。
  输出描述要求我们输出一行若干个整数,表示骑士的路径。编号约定是从西北角开始编号:0, 1, 2, 3…
思路:
  为了解决这个问题,我们可以使用回溯法(Backtracking)来搜索所有可能的路径,直到找到符合要求的路径为止。下面是解题思路的步骤:
  初始化一个N*N的矩阵,用于记录每个方格是否被访问过。初始时,将所有方格标记为未访问。
  从起点(0,0)开始,尝试向下或向右移动,每次移动后更新当前位置,并将对应的方格标记为已访问。
  在每次移动后,更新箭靶上的数字,即向正北方和正西方各增加一箭的数量。
  如果当前位置是终点(N-1,N-1),则检查箭靶上的数字是否符合要求。如果符合要求,则将当前路径加入结果列表。
  如果当前位置不是终点,继续尝试向下或向右移动,重复步骤2-4。
  当所有可能的路径都被尝试过后,返回结果列表中的第一个有效路径作为最终答案。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=21;
int row[N],col[N]; // 定义行和列的数组
int n; // 定义矩阵的大小
int dx[]={-1,0,1,0},dy[]={0,-1,0,1}; // 定义四个方向的偏移量
vector<int> path; // 用来存储路径
bool st[N][N]; // 定义状态数组,用于记录每个位置是否已经访问过// 深度优先搜索函数
bool dfs(int x,int y)
{if(x==n-1 && y==n-1) // 如果到达终点{for(int i=0;i<n;i++)if(row[i]!=0 || col[i]!=0) // 如果还有未访问的行或列,返回falsereturn false;return true; // 否则返回true}for(int i=0;i<4;i++) // 遍历四个方向{int a=x+dx[i],b=y+dy[i]; // 计算下一个位置的坐标if(a<0 || a>=n || b<0 || b>=n || st[a][b]) continue; // 如果越界或者已经访问过,跳过if(row[a]<=0 || col[b]<=0) continue; // 如果该位置无法访问,跳过st[a][b]=true; // 标记该位置已访问row[a]--,col[b]--; // 更新行和列的剩余数量path.push_back(a*n+b); // 将该位置加入路径if(dfs(a,b)) return true; // 如果找到一条路径,返回truest[a][b]=false; // 回溯,恢复该位置的状态row[a]++,col[b]++; // 恢复行和列的剩余数量path.pop_back(); // 回溯,将该位置从路径中移除}return false; // 如果四个方向都无法继续前进,返回false
}int main()
{cin>>n; // 输入矩阵的大小for(int i=0;i<n;i++) cin>>col[i]; // 输入列的数量for(int i=0;i<n;i++) cin>>row[i]; // 输入行的数量col[0]--,row[0]--; // 将起点的行列数量减一st[0][0]=true; // 标记起点已访问path.push_back(0); // 将起点加入路径dfs(0,0); // 从起点开始深度优先搜索for(auto x:path) cout<<x<<' '; // 输出路径return 0;
}

这篇关于蓝桥杯-路径之谜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962269

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使