当前位置: 首页 > news >正文

HJ161 走一个大整数迷宫

  • 题目
  • 题解(10)
  • 讨论(4)
  • 排行

中等 通过率:40.12% 时间限制:1秒 空间限制:256M

知识点广度优先搜索(BFS)

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

给定一个 n×mn×m 的矩阵迷宫,其中第 ii 行第 jj 列的格子权值为


ci,j=ai,j×p2bi,jci,j​=ai,j​×p2bi,j​。


LH 起始位于 (1,1)(1,1),出口位于 (n,m)(n,m)。迷宫配有一个计数器,初始值为 c1,1c1,1​。在任意时刻,若计数器的值满足 counter≡0(mod(p−1))counter≡0(mod(p−1)),且 LH 身处出口 (n,m)(n,m),大门即刻打开,LH 得以逃离。

每经过 11 秒,LH 必须向上、下、左、右四个方向中的某一方向移动一步(不得停留,也不得走出迷宫)。假设 LH 从 (i,j)(i,j) 移动到 (i′,j′)(i′,j′),则计数器会累加 ci′,j′ci′,j′​。

请计算 LH 最快需要多少秒才能逃离;若无论如何都无法逃离,则输出 −1−1。

输入描述:

输入共三部分:
∙ ∙第一行输入三个整数 n,m,p(1≦n,m≦10; 2≦p≦104)n,m,p(1≦n,m≦10; 2≦p≦104);
∙ ∙接下来 nn 行,每行 mm 个整数,构成矩阵 ai,jai,j​;
∙ ∙再接下来 nn 行,每行 mm 个整数,构成矩阵 bi,jbi,j​,范围均为 0≦ai,j,bi,j≦1060≦ai,j​,bi,j​≦106。

输出描述:

输出一个整数,代表最短逃离时间;若无法逃离,输出 −1−1。

示例1

输入:

3 3 10 1 2 3 0 1 4 0 0 0 1 0 0 0 0 1 0 1 0

复制输出:

6

复制说明:

C=[1002030010400000]C=⎣⎡​10000​20100​304000​⎦⎤​。 第一秒,从 (1,1)(1,1) 走到 (1,2)(1,2),计数器的值为 120120。 第二秒,从 (1,2)(1,2) 走到 (1,3)(1,3),计数器的值为 150150。 第三秒,从 (1,3)(1,3) 走到 (1,2)(1,2),计数器的值为 170170。 第四秒,从 (1,2)(1,2) 走到 (2,2)(2,2),计数器的值为 180180。 第五秒,从 (2,2)(2,2) 走到 (3,2)(3,2),计数器的值为 180180。 第六秒,从 (3,2)(3,2) 走到 (3,3)(3,3),计数器的值为 180180,是 99 的倍数,逃出迷宫。

#include <iostream> #include <vector> #include <queue> using namespace std; struct State { int x, y, rem; }; int main() { int n, m, p; cin >> n >> m >> p; vector<vector<int>> a(n, vector<int>(m)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> a[i][j]; } } // b矩阵在计算余数时是不需要的,但仍需读入以消耗输入 vector<vector<int>> b(n, vector<int>(m)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> b[i][j]; } } if (p == 1) { // p-1 = 0, 无法取模 cout << -1 << endl; return 0; } int mod = p - 1; vector<vector<vector<int>>> dist(n, vector<vector<int>>(m, vector<int>(mod, -1))); queue<State> q; int start_rem = a[0][0] % mod; dist[0][0][start_rem] = 0; q.push({0, 0, start_rem}); int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; while (!q.empty()) { State curr = q.front(); q.pop(); int t = dist[curr.x][curr.y][curr.rem]; for (int i = 0; i < 4; ++i) { int nx = curr.x + dx[i]; int ny = curr.y + dy[i]; if (nx >= 0 && nx < n && ny >= 0 && ny < m) { int next_rem = (curr.rem + a[nx][ny]) % mod; if (dist[nx][ny][next_rem] == -1) { dist[nx][ny][next_rem] = t + 1; q.push({nx, ny, next_rem}); } } } } cout << dist[n - 1][m - 1][0] << endl; return 0; }
http://www.jsqmd.com/news/589086/

相关文章:

  • 第26章 2020真题作文
  • M5Unit-DigiClock模块:基于I²C的即插即用数字时钟解决方案
  • 深入解析ROS应用开发:架构、算法、硬件集成与工程实践
  • C++ 与 向量化掩码(Masking):在 C++ 矢量化计算中利用硬件掩码寄存器处理循环边界的条件分支逻辑
  • Agent 的能力体系
  • 从代码混淆到动态加载——构建Android多层次反编译防护体系
  • 嵌入式裸机编程内存管理优化实践
  • TLT库:面向Arduino的Telit ME310G1蜂窝通信轻量级C++ SDK
  • CLion开发STM32:环境配置与高效调试指南
  • ROS 机器人开发工程师技术开发指南
  • OpenClaw多任务测试:Qwen3-32B在RTX4090D上的并行处理极限
  • openclaw本地安装包一键安装 集成400+大模型+微信、企业微信、钉钉、飞书图形界面参数,无需复杂配置
  • HJ162 ACM中的AC题
  • 嵌入式开发中的代码静态分析工具与应用
  • 你以为 Android 返回手势就是往右划?太天真了
  • Adafruit GFX图形库:嵌入式显示驱动的分层架构与实践
  • RTOS在嵌入式开发中的核心价值与实战应用
  • 社交娱乐场景下AI智能体开发:技术实现与产品落地
  • ArduCMSIS-DSP:Arduino平台的ARM官方DSP库移植指南
  • PHP的作用域的生命周期的庖丁解牛
  • PCB设计中数字地与模拟地的区分与处理技巧
  • RT-Thread环境搭建与内核开发实战指南
  • 大模型推理凭什么这么贵?从GRPO到BCR,推理效率之战全解析
  • Linux内核中的eBPF技术详解
  • DLP投影系统驱动开发与优化技术详解
  • 富士通再向英国子公司注资8000万英镑 邮政丑闻后遗症持续
  • ButtonGestures:单按钮六态手势识别嵌入式实现
  • Linux内核中的cgroups v2资源管理技术
  • Linux下C程序编译过程详解与GCC工具链使用
  • 2026年金堂护栏定制实力品牌深度测评与选购指南 - 2026年企业推荐榜