蓝桥杯-AB路线(详细原创)

embedded/2024/10/21 0:30:08/

问题描述:

有一个由 N × M 个方格组成的迷宫,每个方格写有一个字母 A 或者 B。小蓝站在迷宫左上角的方格,目标是走到右下角的方格。他每一步可以移动到上下左右相邻的方格去。

由于特殊的原因,小蓝的路线必须先走 K 个 A 格子、再走 K 个 B 格子、再走 K 个 A 格子、再走 K 个 B 格子…如此反复交替。

请你计算小蓝最少需要走多少步,才能到达右下角方格? 注意路线经过的格子数不必一定是 K 的倍数,即最后一段 A 或 B 的格子可以不满 K 个。起点保证是 A 格子。

例如 K=3 时,以下 3 种路线是合法的:

AAA
AAAB
AAABBBAAABBB

以下 3 种路线不合法:

ABABAB
ABBBAAABBB
AAABBBBBBBAAA

输入格式

第一行包含三个整数 N、M 和 K。

以下 N 行,每行包含 M 个字符 ( A 或 B ),代表格子类型。

输出格式

一个整数,代表最少步数。如果无法到达右下角,输出 -1。

样例输入

4 4 2
AAAB
ABAB
BBAB
BAAA

样例输出

8

样例说明

每一步方向如下:下右下右上右下下;路线序列:AABBAABBA。

评测用例规模与约定

对于 20% 的数据,1 ≤ N, M ≤ 4。

对于另 20% 的数据,K=1。

对于 100% 的数据,1 ≤ N, M ≤ 1000,1 ≤ K ≤ 10。

题解:

宽搜bfs题, 用queue队列按要求搜索。

但需要注意 正常二维bfs搜索标记是否访问过的st数组用的二维, 但是这题用的st数组是三维

st含义:

st[x][y][z]: 坐标x, y上的字符, 在第z次访问的时候是否访问过了

如下图:
图中圈起来的B, 当每一步走的是: 下下下下, 此时第一次遍历到B, st[3][0][0] = true, 然后继续 下下下右上上上左, 此时又一次遍历到这个B, st[3][0][2] = true, 最后上右右右下下下下, 到达(n,m)

  • 当第一次遍历到B的时候st中的z = 0, 因为此时的B位于BBB的第一个
  • 当第二次遍历到B的时候st中的z = 2, 因为此时的B位于BBB的第三个

如果我们用的还是二维st, 那么就不可能第二次遍历到B, 也就找不到答案了

ac代码👇

#include <bits/stdc++.h>
using namespace std;
struct Node
{int x, y, deep, step;  // deep深度, step是一共走的步数, 初始位置也算一步, deep初始化是0, step初始化是1
};
const int N = 1e3 + 10;
int n, m, k; 
char g[N][N];
bool st[N][N][20];  // 打标记, 看之前是否走过, 防止进入死循环
int go[N][N] = {{0, 1}, {0, - 1}, {1, 0}, {-1, 0}};  // 四个方向可以走int bfs()
{queue<Node> q;q.push({0, 0, 0, 1}); st[0][0][0] = true; while (q.size()){auto t = q.front();q.pop();if (t.x == n - 1 && t.y == m - 1) return t.deep;  // 找到答案, 返回for (int i = 0; i < 4; i ++){int aa = t.x + go[i][0], bb = t.y + go[i][1], stp = t.step + 1;if (aa < 0 || aa >= n || bb < 0 || bb >= m) continue;  // 超出边界, 跳过循环if (stp > k)   // 需要转换字符{stp = 1;if (g[aa][bb] == g[t.x][t.y]) continue;  // 如果字符跟原来相同, 跳过}else   // 不需要转换字符{if (g[aa][bb] != g[t.x][t.y]) continue;  // 如果字符跟原来不同, 跳过}if (!st[aa][bb][stp])  // 没有访问过{st[aa][bb][stp] = true;q.push({aa, bb, t.deep + 1, stp});}}}return -1;  // 没有找到答案, 无解
}int main()
{cin >> n >> m >> k;for (int i = 0; i < n; i ++) cin >> g[i];int res = bfs();cout << res << endl;return 0;
}

觉得写的不错的话, 点个赞吧~


http://www.ppmy.cn/embedded/44233.html

相关文章

PySpark面试题精选及参考答案(3万字长文)

目录 什么是PySpark以及它的主要应用场景 解释PySpark与Spark的关系 什么是RDD,它有哪些特性?

Dinky MySQLCDC 整库同步到 MySQL jar包冲突问题解决

资源&#xff1a;flink 1.17.0、dinky 1.0.2 问题&#xff1a;对于kafka相关的包内类找不到的情况 解决&#xff1a;使用 flink-sql-connector- 胖包即可&#xff0c;去掉 flink-connector- 相关瘦包&#xff0c;解决胖瘦包冲突 source使用 flink-sql-connector- 胖包&#…

你真的懂firewalld吗?不妨看看我的这篇文章

一、firewalld简介 firewalld防火墙是Linux系统上的一种动态防火墙管理工具&#xff0c;它是Red Hat公司开发的&#xff0c;并在许多Linux发行版中被采用。相对于传统的静态防火墙规则&#xff0c;firewalld使用动态的方式来管理防火墙规则&#xff0c;可以更加灵活地适应不同…

JRT1.7发布

JRT1.7连仪器在线演示视频 JRT1.5实现质控主体、1.6基本完成质控&#xff1b;本次版本推进到1.7&#xff0c;1.7集菜单权限、登录、打印导出客户端、初始化、质控、Linux客户端、仪器连接和监控体系各种功能大全&#xff0c;上十年写系统用到的都全了。 这次直接挑战检验最难…

Java-常见面试题收集(十五)

二十四 Elasticsearch 1 Elasticsearch 的倒排索引 传统的检索方式是通过文章&#xff0c;逐个遍历找到对应关键词的位置。 倒排索引&#xff0c;是通过分词策略&#xff0c;形成了词和文章的映射关系表&#xff0c;也称倒排表&#xff0c;这种词典 映射表即为倒排索引。 其中…

vue富文本层级高

在Vue中处理复杂的层级关系&#xff0c;通常可以使用组件和递归组件来构建富文本树形结构。以下是一个简单的例子&#xff0c;展示了如何使用Vue组件来构建一个树形控件 <template><div><tree-node v-for"node in treeData" :key"node.id&quo…

SQL 语言:嵌入式 SQL 和动态 SQL

文章目录 基本概述嵌入式 SQL动态 SQL总结 基本概述 嵌入式SQL和动态SQL是两种在应用程序中嵌入和使用SQL语句的方法。它们都允许开发人员在编程语言中编写SQL语句&#xff0c;以便在应用程序中执行数据库操作。然而&#xff0c;这两种方法在实现方式、性能和灵活性方面存在一…

贝叶斯算法:机器学习中的“黄金法则”与性能提升之道

&#x1f440;传送门&#x1f440; &#x1f50d;机器学习概述&#x1f340;贝叶斯算法原理&#x1f680;贝叶斯算法的应用✨文本分类✨医疗系统 &#x1f496;贝叶斯算法优化✨贝叶斯算法优化的主要步骤✨贝叶斯算法优化的优点✨贝叶斯算法优化的局限性 &#x1f697;贝叶斯算…