5989.数字接龙

5989.数字接龙

小蓝最近迷上了一款名为《数字接龙》的迷宫游戏,游戏在一个大小为 N×N 的格子棋盘上展开,其中每一个格子处都有着一个 0…K−10…K−1 之间的整数。

游戏规则如下:

  1. 从左上角 (0,0) 处出发,目标是到达右下角 (N−1,N−1) 处的格子,每一步可以选择沿着水平/垂直/对角线方向移动到下一个格子。
  2. 对于路径经过的棋盘格子,按照经过的格子顺序,上面的数字组成的序列要满足:0,1,2,…,K−1,0,1,2,…,K−1,0,1,2…0,1,2,…,K−1,0,1,2,…,K−1,0,1,2…。
  3. 途中需要对棋盘上的每个格子恰好都经过一次(仅一次)。
  4. 路径中不可以出现交叉的线路。例如之前有从 (0,0) 移动到 (1,1),那么再从 (1,0) 移动到 (0,1) 线路就会交叉。

为了方便表示,我们对可以行进的所有八个方向进行了数字编号,如下图 22 所示;因此行进路径可以用一个包含 0…70…7 之间的数字字符串表示,如下图 11 是一个迷宫示例,它所对应的答案就是:4125521441255214。

1.png

现在请你帮小蓝规划出一条行进路径并将其输出。

如果有多条路径,输出字典序最小的那一个;如果不存在任何一条路径,则输出 −1

输入格式

第一行包含两个整数 N,K

接下来输入 N 行,每行 N 个整数表示棋盘格子上的数字。

输出格式

输出一行表示答案。如果存在答案输出路径,否则输出 −1

数据范围

对于 80% 的评测用例:1≤N≤5。
对于 100% 的评测用例:1≤N≤10,1≤K≤10。

输入样例:
3 3
0 2 0
1 1 1
2 0 2
输出样例:
41255214

解析:

const int N = 11;
int g[N][N];
bool st[N][N], edge[N][N][N][N];
int n, k;
int dx[] = { -1,-1,0,1,1,1,0,-1 };
int dy[] = { 0,1,1,1,0,-1,-1,-1,0 };
string path;
  • N 是一个常量,表示网格的最大尺寸。
  • g 是一个二维数组,用于存储网格中每个点的值。
  • st 是一个二维数组,用于标记每个点是否已经被访问过。
  • edge 是一个四维数组,用于标记两个点之间是否存在边。
  • nk 是输入的变量,分别表示网格的大小和一个用于判断路径合法性的模数。
  • dxdy 是两个数组,用于表示八个方向的偏移量。
  • path 是一个字符串,用于存储找到的路径。

深度优先搜索函数 dfs

bool dfs(int a, int b) {
    if (a == n - 1 && b == n - 1) {
        return path.size() == n * n - 1;
    }
    st[a][b] = true;
    for (int i = 0; i < 8; i++) {
        int x = a + dx[i];
        int y = b + dy[i];
        if (x < 0 || x >= n || y < 0 || y >= n) {
            continue;
        }
        if (st[x][y]) continue;
        if (g[x][y] != (g[a][b] + 1) % k) {
            continue;
        }
        if (i % 2 && edge[a][y][x][b] || edge[x][b][a][y]) {
            continue;
        }
        edge[a][b][x][y] = true;
        path += i + '0';
        if (dfs(x, y)) {
            return true;
        }
        path.pop_back();
        edge[a][b][x][y] = false;
    }
    st[a][b] = false;
    return false;
}
  • 这个函数使用深度优先搜索算法来尝试找到一条从当前点 (a, b) 到右下角的合法路径。
  • 如果当前点是右下角且路径长度等于网格中所有点的数量减一,则返回 true,表示找到了一条合法路径。
  • 然后,它遍历八个方向,检查每个方向上的点是否合法(未超出边界、未被访问过、值满足条件、没有边冲突)。
  • 如果某个方向上的点合法,则标记该点为已访问,将该方向添加到路径中,并递归调用 dfs 函数。
  • 如果递归调用返回 true,则表示找到了一条合法路径,返回 true
  • 如果递归调用返回 false,则回溯,将该方向从路径中移除,并标记该点为未访问。
  • 如果所有方向都尝试过但没有找到合法路径,则返回 false

注意:在这段代码中,(g[a][b] + 1) % k 的目的是确保路径上的每个点的值满足一定的条件。具体来说,它要求路径上的每个点的值比前一个点的值大 1,并且在达到 k 时循环回到 0。

主函数 main

int main() {
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> g[i][j];
        }
    }
    if (!dfs(0, 0)) {
        cout << "-1";
    }
    cout << path;
    return 0;
}
  • 主函数首先读取网格的大小 n 和模数 k

  • 然后,它读取网格中每个点的值,并将其存储在 g 数组中。

  • 接着,它调用 dfs 函数从左上角开始搜索路径。

  • 如果没有找到合法路径,则输出 -1

  • 最后,它输出找到的路径。

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2)

  • 空间复杂度 O ( n 4 ) O(n^4) O(n4)

完整代码:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int N = 11;
int g[N][N];
bool st[N][N],edge[N][N][N][N];
int n, k;
int dx[]={ -1,-1,0,1,1,1,0,-1 };
int dy[] = {0,1,1,1,0,-1,-1,-1,0};
string path;
bool dfs(int a, int b) {
	if (a == n - 1 && b == n - 1) {
		return path.size()==n*n-1;
	}
	st[a][b] = true;
	for (int i = 0; i < 8; i++) {
		int x = a + dx[i];
		int y = b + dy[i];
		if (x<0 || x>=n || y<0 || y>=n) {
			continue;
		}
		if(st[x][y]) continue;
		if (g[x][y] != (g[a][b] + 1)%k) {
			continue;
		}
		if (i%2 && edge[a][y][x][b] || edge[x][b][a][y]) {
			continue;
		}
		edge[a][b][x][y] = true;
		path+=i + '0';
		if (dfs(x, y)) {
			return true;
		}
		path.pop_back();
		edge[a][b][x][y] = false;
	}
	st[a][b] = false;
	return false;
}
int main() {
	cin>>n>>k;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> g[i][j];
		}
	}
	if(!dfs(0,0)){
	    cout<<"-1";
	}
	cout<<path;
	return 0;
}

image-20250122203416099

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Titans: 学习在测试时记忆 - 论文解读与总结

论文地址&#xff1a;https://arxiv.org/pdf/2501.00663v1 本文介绍了一篇由 Google Research 发表的关于新型神经网络架构 Titans 的论文&#xff0c;该架构旨在解决传统 Transformer 在处理长序列时的局限性。以下是对论文的详细解读&#xff0c;并结合原文图片进行说明&…

账号IP属地:依据手机号还是网络环境?

在数字化生活中&#xff0c;账号的IP属地信息往往成为我们关注的一个焦点。无论是出于安全考虑&#xff0c;还是为了满足某些特定服务的需求&#xff0c;了解账号IP属地的确定方式都显得尤为重要。那么&#xff0c;账号IP属地根据手机号还是网络来确定的呢&#xff1f;本文将深…

微信小程序实现自定义日历功能

文章目录 1. 创建日历组件实现步骤&#xff1a;2. 代码实现过程3. 实现效果图4. 关于作者其它项目视频教程介绍 1. 创建日历组件实现步骤&#xff1a; 创建日历组件&#xff1a;首先&#xff0c;你需要创建一个日历组件&#xff0c;包含显示日期的逻辑。样式设计&#xff1a;为…

YOLOv9改进,YOLOv9检测头融合RFAConv卷积,适合目标检测、分割任务

摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…

【机器学习】深入无监督学习分裂型层次聚类的原理、算法结构与数学基础全方位解读,深度揭示其如何在数据空间中构建层次化聚类结构

&#x1f31f;个人主页&#xff1a;落叶 &#x1f31f;当前专栏: 机器学习专栏 目录 引言 分裂型层次聚类&#xff08;Divisive Hierarchical Clustering&#xff09; 1. 基本原理 2. 分裂型层次聚类的算法步骤 Step 1: 初始化 Step 2: 选择分裂的簇 Step 3: 执行分裂操作…

VirtualBox can‘t enable the AMD-V extension

个人博客地址&#xff1a;VirtualBox cant enable the AMD-V extension | 一张假钞的真实世界 最近一次完成Deepin的系统更新后&#xff0c;进入VirtualBox创建的虚拟机&#xff08;Widows10&#xff09;时&#xff0c;出现以下错误&#xff1a; 根据网址“https://askubuntu.…

[JavaScript] 数组与对象详解

文章目录 数组&#xff08;Array&#xff09;什么是数组数组的常用操作**访问数组元素****修改数组元素****数组的长度****添加和删除元素** 常用数组方法map():filter():reduce():**其他实用方法** 对象&#xff08;Object&#xff09;什么是对象对象的基本操作**访问属性****…

“模板”格式化发布新创诗(为《诗意 2 0 2 5》贡献力量)

预置MarkDown&Html文本&#xff0c;脚本读取f-string模板完成录入嵌套。 (笔记模板由python脚本于2025-01-22 19:19:58创建&#xff0c;本篇笔记适合喜欢分享的达人的coder翻阅) 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不…

论文速读|Multi-Modal Disordered Representation Learning Network for TBPS.AAAI24

论文地址&#xff1a;Multi-Modal Disordered Representation Learning Network for Description-Based Person Search 代码地址&#xff1a;未开源&#xff08;2025.01.22&#xff09; bib引用&#xff1a; inproceedings{yang2024multi,title{Multi-Modal Disordered Repres…

计算机视觉算法实战——实体物体跟踪

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​ ​ 1. 领域介绍✨✨ 实体物体跟踪&#xff08;Object Tracking&#xff09;是计算机视觉领域中的一个重要研究方向&#x…

C++17 新特性深入解析:constexpr 扩展、if constexpr 和 constexpr lambda

C17 不仅增强了现有特性&#xff0c;还引入了一些全新的编程工具&#xff0c;极大地提升了代码的效率和表达力。在这篇文章中&#xff0c;我们将深入探讨 C17 中与 constexpr 相关的三个重要特性&#xff1a;constexpr 的扩展用法、if constexpr 和 constexpr lambda。这些特性…

IVR:交互式语音应答系统解析及其应用

引言 IVR&#xff08;Interactive Voice Response&#xff09;&#xff0c;即交互式语音应答系统&#xff0c;是一种功能强大的电话自动服务系统。它通过语音识别和按键反馈&#xff0c;使用户与系统之间实现实时交互&#xff0c;为用户提供自助服务、咨询、报告、投诉等多种功…

Observability:最大化可观察性 AI 助手体验的 5 大提示(prompts)

作者&#xff1a;来自 Elastic Zoia_AUBRY 在过去三年担任客户工程师期间&#xff0c;我遇到了数百名客户&#xff0c;他们最常问的问题之一是&#xff1a;“我的数据在 Elastic 中&#xff1b;我该如何利用它获得最大优势&#xff1f;”。 如果这适用于你&#xff0c;那么本…

【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项

文章目录 S10L45 Working with Multiple Windows1 水平分割窗口2 在水平分割的新窗口中显示其它文件内容3 垂直分割窗口4 窗口的关闭5 在同一窗口水平拆分出多个窗口6 关闭其余窗口7 让四个文件呈田字形排列8 光标在多窗口中的定位9 调节子窗口的尺寸大小10 变换子窗口的位置11…

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 一、SD卡 速读 SD卡&#xff0c;全称Secure Digital M…

大模型GUI系列论文阅读 DAY2续:《一个具备规划、长上下文理解和程序合成能力的真实世界Web代理》

摘要 预训练的大语言模型&#xff08;LLMs&#xff09;近年来在自主网页自动化方面实现了更好的泛化能力和样本效率。然而&#xff0c;在真实世界的网站上&#xff0c;其性能仍然受到以下问题的影响&#xff1a;(1) 开放领域的复杂性&#xff0c;(2) 有限的上下文长度&#xff…

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

前言 手头上有个ESP32&#xff0c;发现有wifi功能&#xff0c;希望连接JY61P并通过WIFI把姿态数据发送给电脑 1.采用Arduino IDE编译器&#xff1b;需要安装ESP32的开发板管理器&#xff1b; 2.电脑接受数据是基于python的&#xff1b; 1. ESP32 连接手机WIFI #include <…

C语言程序设计十大排序—冒泡排序

文章目录 1.概念✅2.冒泡排序&#x1f388;3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅ 1.概念✅ 排序是数据处理的基本操作之一&#xff0c;每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法&#xff0c;排序后的数据更易于处理和查找。在计算机发展…

【Elasticsearch】腾讯云安装Elasticsearch

Elasticsearch 认识Elasticsearch安装Elasticsearch安装Kibana安装IK分词器分词器的作用是什么&#xff1f;IK分词器有几种模式&#xff1f;IK分词器如何拓展词条&#xff1f;如何停用词条&#xff1f; 认识Elasticsearch Elasticsearch的官方网站如下 Elasticsearch官网 Ela…

Django学习笔记(安装和环境配置)-01

Django学习笔记(安装和环境配置)-01 一、创建python环境 1、可以通过安装Anaconda来创建一个python环境 # 创建一个虚拟python环境 conda create -n django python3.8 # 切换激活到创建的环境中 activate django2、安装django # 进入虚拟环境中安装django框架 pip install …