[蓝桥杯]真题讲解:AB路线(BFS+分层图)

embedded/2024/10/16 2:24:50/

[蓝桥杯]真题讲解:AB路线(BFS+分层图)

  • 一、视频讲解
  • 二、正解代码
    • 1、C++
    • 2、python3
    • 3、Java

一、视频讲解

[蓝桥杯]真题讲解:AB路线(BFS+分层图)

在这里插入图片描述

二、正解代码

1、C++

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e3 + 10;
int g[N][N];
bool st[N][N][20];
int dis[N][N][20];int n, m, k;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};bool check(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m;
}int bfs() {for(int i = 0; i < n; i ++) {for(int j = 0; j < m; j ++) {for(int p = 0; p < k; p ++) {dis[i][j][p] = INF;}}}queue<array<int,3>>q;q.push({0, 0, 1});dis[0][0][1] = 1;st[0][0][1] = true;while(q.size()){auto t = q.front();q.pop();int x = t[0], y = t[1], cnt = t[2];int d = dis[x][y][cnt];for(int i = 0; i < 4; i ++) {int nx = x + dx[i];int ny = y + dy[i];int nc = (d / k) % 2;if(check(nx, ny) && g[nx][ny] == nc && !st[nx][ny][(d + 1) % k]) {st[nx][ny][(d + 1) % k] = true;q.push({nx, ny, (d + 1) % k});dis[nx][ny][(d + 1) % k] = d + 1;}}}int minv = INF;for(int i = 0; i < k; i ++) {minv = min(minv, dis[n - 1][m - 1][i]);}return minv;
}void solve(){cin >> n >> m >> k;for(int i = 0; i < n; i ++) {string s; cin >> s;for(int j = 0; j < m; j ++) {g[i][j] = (s[j] != 'A');}}int res = bfs();if(res == INF){cout << -1 << endl;}else{cout << res - 1 << endl;}}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t = 1;while(t--){solve();}return 0;
}

2、python3

from collections import deque
INF = 0x3f3f3f3f
N = 1010
n, m, k = map(int, input().split())
st = [[[False] * 20 for _ in range(N)] for _ in range(N)]
dis = [[[INF] * 20 for _ in range(N)] for _ in range(N)]
g = [[0] * N for _ in range(N)]
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]def check(x, y):return x >= 0 and x < n and y >= 0 and y < mdef bfs():q = deque([(0, 0, 1)])dis[0][0][1] = 1st[0][0][1] = Truewhile q:x, y, cnt = q[0]q.popleft()d = dis[x][y][cnt]for i in range(4):nx = x + dx[i]ny = y + dy[i]nc = (d // k) % 2if check(nx, ny) and g[nx][ny] == nc and st[nx][ny][(d + 1) % k] == False:st[nx][ny][(d + 1) % k] = Trueq.append((nx, ny, (d + 1) % k))dis[nx][ny][(d + 1) % k] = d + 1minv = INFfor i in range(k):minv = min(minv, dis[n - 1][m - 1][i])return minvfor i in range(n):s = input()for j in range(m):if s[j] != 'A':g[i][j] = 1else:g[i][j] = 0
res = bfs()
if res == INF:print(-1)
else:print(res - 1)

3、Java

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class ABRoad {public static final int INF = 0x3f3f3f3f;public static int[] dx = new int[]{-1, 0, 1, 0};public static int[] dy = new int[]{0, 1, 0, -1};public static int n, m, k;public static int[][] g;public static boolean[][][] st;public static int[][][] dis;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();k = sc.nextInt();g = new int[n + 10][m + 10];st = new boolean[n + 10][m + 10][k + 10];dis = new int[n + 10][m + 10][k + 10];for(int i = 0; i < n; i ++ ) {String s;s = sc.next();for(int j = 0; j < m; j ++) {if(s.charAt(j) != 'A')g[i][j] = 1;elseg[i][j] = 0;}}int res = bfs();if(res == INF)System.out.println(-1);elseSystem.out.println(res - 1);}private static int bfs() {for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {for (int p = 0; p < k; p++) {dis[i][j][p] = INF;}}}Queue<int[]> q = new LinkedList<>();q.add(new int[]{0, 0, 1});dis[0][0][1] = 1;st[0][0][1] = true;while (!q.isEmpty()) {int[] t = q.poll();int x = t[0], y = t[1], cnt = t[2];int d = dis[x][y][cnt];for (int i = 0; i < 4; i++) {int nx = x + dx[i];int ny = y + dy[i];int nc = (d / k) % 2;if (check(nx, ny) && g[nx][ny] == nc && !st[nx][ny][(d + 1) % k]) {st[nx][ny][(d + 1) % k] = true;q.add(new int[]{nx, ny, (d + 1) % k});dis[nx][ny][(d + 1) % k] = d + 1;}}}int minv = INF;for(int i = 0; i < k; i ++) {minv = Math.min(minv, dis[n - 1][m - 1][i]);}return  minv;}private static boolean check(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m;}
}

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

相关文章

sql注入之bool盲注

目录 盲注步骤 1、进入靶场 2、如下图所示输入&#xff1f;id1‘ 判断此时存在注入点 3、判断列数 ​编辑 4、开始盲注 普通的python脚本 代码思想 结果 二分查找python脚本 二分查找算法思想简介 二分查找与普通查找的主要差距 代码思想 代码 结果​编辑 下面以…

Python3 笔记:Python的变量

一、变量&#xff08;variable&#xff09;&#xff1a;跟常量相对应&#xff0c;指可以改变的值。也就是说&#xff0c;它是不固定的&#xff0c;是可以被重复赋值的。 Python3 笔记&#xff1a;Python的赋值语句-CSDN博客 变量在计算机语言中&#xff0c;可以用于存储不同的…

设计模式-责任链模式

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 目录 定义 特点 使用场景 优缺点 (1) 优点 (2)…

elasticsearch文档读写原理大致分析一下

文档写简介 客户端通过hash选择一个node发送请求&#xff0c;专业术语叫做协调节点 协调节点会对document进行路由&#xff0c;将请求转发给对应的primary shard primary shard在处理完数据后&#xff0c;会将document 同步到所有replica shard 协调节点将处理结果返回给…

Linux sliplogin命令教程:如何使用sliplogin命令建立SLIP服务器(附实例详解和注意事项)

Linux sliplogin命令介绍 sliplogin&#xff08;Serial Line Internet Protocol Login&#xff09;命令用于将SLIP接口加入标准输入&#xff0c;把一般终端机的连线变成SLIP连线。通常可用来建立SLIP服务器&#xff0c;让远端电脑以SLIP连线到服务器。 Linux sliplogin命令适…

Zynq开发-使用PYNQ快速入门摄像头MIPI驱动(OV5640)

目录 1. 简介 2. 配置代码 2.1 初始化寄存器 2.2 分辨率寄存器 2.3 白平衡寄存器 2.4 配置寄存器代码 2.5 顶层代码 3. 细节指引 4. 总结 1. 简介 PYNQ是一种基于Python的开发环境&#xff0c;专门设计用于快速、简便地在Xilinx的Zynq平台上进行开发。在《Zynq开发之…

Vue3中使用Swiper8进行图片轮播

1、在vue项目中安装swiper&#xff0c;默认安装是Swiper8的版本 cnpm i swiper 2、引入组件、样式和所需要的模块 import { Swiper, SwiperSlide } from swiper/vue import { Autoplay, Pagination, Navigation, Scrollbar } from swiper import swiper/css import swiper/…

Edge浏览器的使用心得与深度探索

在这个浏览器大战的时代&#xff0c;Microsoft Edge作为一款重新设计的现代浏览器&#xff0c;自发布以来就备受瞩目。它不仅在速度、兼容性上有了显著提升&#xff0c;还集成了许多创新功能&#xff0c;为用户带来了全新的浏览体验。本文将从个人使用心得出发&#xff0c;深入…