(BFS)題解:P9425 [藍橋杯 2023 國 B] AB 路線

題解:P9425 [藍橋杯 2023 國 B] AB 路線

題目傳送門

P9425 [藍橋杯 2023 國 B] AB 路線

一、題目描述

給定一個N×M的迷宮,每個格子標記為A或B。從左上角(1,1)出發,需要移動到右下角(N,M)。移動規則是:必須交替走K個A格子和K個B格子,最后一段可以不足K個。求最少步數,若無法到達則輸出-1。

二、題目分析

這是一個典型的帶約束的最短路徑問題,需要在普通BFS的基礎上增加對移動規則的檢查。關鍵在于如何記錄當前已經連續走了多少個相同字母的格子。

三、解題思路

  1. 使用BFS進行最短路徑搜索
  2. 狀態需要記錄:當前位置(x,y)、當前步數sum、當前連續走的相同字母數量
  3. 每次移動時檢查:
    • 下一個格子的字母是否符合交替規則
    • 連續相同字母數量是否超過K
  4. 使用三維數組st[x][y][cnt]記錄是否訪問過某個狀態,避免重復計算

四、算法講解(結合例子)

以樣例為例:

4 4 2
AAAB
ABAB
BBAB
BAAA
  • 起點(1,1)是A,初始狀態(1,1,0)
  • 第一步可以走A(連續1個A),狀態變為(2,1,1)
  • 第二步必須走A(因為K=2),狀態變為(3,1,0)(因為已經連續2個A,下次需要B)
  • 第三步必須走B,狀態變為(3,2,1)
  • …直到到達終點(4,4)

五、代碼實現

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, m, k;
char g[N][N];
struct Node {int x, y, sum = 0;char ch;Node() : x(0), y(0), sum(0), ch('\0') {}Node(int _x, int _y, int _sum, char _ch) : x(_x), y(_y), sum(_sum), ch(_ch) {}
};Node q[N * N * 10]; // 隊列
bool st[N][N][15]; // 狀態標記數組,第三維記錄連續步數int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};void bfs() {int tt = -1, hh = 0;q[++tt] = {1, 1, 0, 'A'}; // 起點st[1][1][0] = true;while (hh <= tt) {auto t = q[hh++];if (t.x == n && t.y == m) { // 到達終點cout << t.sum;return;}for (int i = 0; i < 4; i++) {int a = t.x + dx[i];int b = t.y + dy[i];if (a < 1 || b < 1 || a > n || b > m) continue; // 邊界檢查// 計算下一個應該走的字符int tmp = ((t.sum + 1) / k) % 2;char nextch = 'A' + tmp;if (st[a][b][(t.sum % k) + 1]) continue; // 狀態已訪問if (g[a][b] == nextch) { // 字母符合要求st[a][b][(t.sum % k) + 1] = true;q[++tt] = {a, b, t.sum + 1, g[a][b]};}}}cout << -1; // 無法到達
}void solve() {cin >> n >> m >> k;for (int i = 1; i <= n; i++)cin >> (g[i] + 1); bfs();
}int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);solve();return 0;
}

六、重點細節

  1. 狀態設計:使用三維狀態(x,y,cnt),其中cnt記錄當前連續走的相同字母數量
  2. 字母交替規則:通過((sum+1)/k)%2計算下一步應該走A還是B
  3. 邊界處理:檢查坐標是否越界
  4. 狀態去重:使用st數組避免重復訪問相同狀態

七、復雜度分析

  • 時間復雜度:O(NMK),每個格子最多被訪問K次
  • 空間復雜度:O(NMK),用于存儲狀態標記

八、總結

本題在傳統BFS的基礎上增加了字母交替的約束條件,需要巧妙設計狀態來記錄連續步數。關鍵點在于:

  1. 正確計算下一步應該走的字母
  2. 合理設計狀態避免重復計算
  3. 處理邊界條件和終止條件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75229.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python-leetcode 62.搜索插入位置

題目&#xff1a; 給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置 方法一&#xff1a;二分查找 假設題意是在排序數組中尋找是否存在一個目標值&#xff0c;則可以…

【計網速通】計算機網絡核心知識點和高頻考點——數據鏈路層(一)

數據鏈路層核心知識點&#xff08;一&#xff09; 一、數據鏈路層概述 1.1 基本概念 數據鏈路層位于OSI模型的第二層&#xff0c;介于物理層和網絡層之間&#xff0c;主要負責在相鄰節點之間傳輸和識別數據幀。 1.2 主要功能 幀同步&#xff1a;識別幀的開始和結束差錯控制…

模型部署與調用

目錄 部署 ollama下載 模型版本選擇 ?編輯 對照表 控制臺執行 調用 部署 大模型部署我使用的是Ollama&#xff0c;點擊跳轉 接下來我將在本地使用ollama就行模型部署的演示 ollama下載 模型版本選擇 對照表 大家可以根據自己的顯卡配置選擇對應的模型版本 控制臺執…

Rstudio如何使用Conda環境配置的R

前言 Rstudio作為一款流行的R語言集成開發環境&#xff08;IDE&#xff09;&#xff0c;為用戶提供了便捷的編程體驗。然而&#xff0c;不同項目可能需要不同版本的R&#xff0c;這就需要我們靈活切換R版本。除了在之前文章中提到的使用 Docker 部署不同版本的 R 的方法之外&am…

C++---RAII模式

一、RAII模式概述 1. 定義 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;即資源獲取即初始化&#xff0c;是C中用于管理資源生命周期的一種重要編程模式。其核心在于將資源的獲取和釋放操作與對象的生命周期緊密綁定。當對象被創建時&#xff0c;資源…

【功能開發】DSP F2837x 檢測中斷所有函數運行一次的時間

要查看 DSP F28377 的 CPU 在 50 微秒一次的中斷內所有程序運行完總共占用了中斷多長時間&#xff0c;可以采用硬件定時器測量和軟件計時兩種常見方法。 方法一&#xff1a;使用硬件定時器測量 原理 利用 DSP 內部的高精度硬件定時器&#xff0c;在中斷開始時記錄定時器的值…

MAC環境給docker換源

2025-03-28 MAC環境給docker換源 在官網下載docker ,dmg 文件 參考&#xff1a; https://blog.csdn.net/qq_73162098/article/details/145014490 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},&q…

Vulnhub-zico2靶機打靶記錄

本篇文章旨在為網絡安全滲透測試靶機教學。通過閱讀本文&#xff0c;讀者將能夠對滲透Vulnhub系列zico2靶機有一定的了解 一、信息收集階段 靶機下載地址&#xff1a;https://download.vulnhub.com/zico/zico2.ova 因為靶機為本地部署虛擬機網段&#xff0c;查看dhcp地址池設…

【LeetCode 熱題100】347:前 K 個高頻元素(詳細解析)(Go語言版)

&#x1f680; 力扣熱題 347&#xff1a;前 K 個高頻元素&#xff08;詳細解析&#xff09; &#x1f4cc; 題目描述 力扣 347. 前 K 個高頻元素 給你一個整數數組 nums 和一個整數 k&#xff0c;請你返回其中出現頻率 前 k 高的元素。你可以按 任意順序 返回答案。 &#x1f…

Java 大視界 -- Java 大數據機器學習模型在金融衍生品定價中的創新方法與實踐(166)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

深度學習入門:從神經網絡基礎到簡單實現

深度學習作為人工智能領域最令人興奮的技術之一,已經在圖像識別、自然語言處理、語音識別等多個領域取得了突破性進展。本文將深入淺出地介紹深度學習的基本概念,并通過Python代碼實現一個簡單的神經網絡模型,幫助讀者建立直觀理解并邁出實踐第一步。 神經網絡的基本原理 …

第2.6節 iOS生成全量和增量報告

2.6.1 簡介 在采集了覆蓋率數據后&#xff0c;就需要生成對應需求的全量和增量覆蓋率報告&#xff0c;以便對測試進行查漏補缺。IOS系統有兩種開發語言&#xff0c;所以生成報告的方式也不相同&#xff0c;下面就分別介紹一下Object C和Swift語言如何生成覆蓋率報告。 2.6.2 O…

STM32技能綜合鞏固

一、深入理解ARMCPU架構及其指令格式、ARM匯編語言編程方法 1.匯編語言編程&#xff0c;實現LED燈 新建keil項目&#xff0c;選擇芯片 選擇運行環境以及配置 添加.s文件 匯編程序&#xff1a; AREAMYDATA,DATA AREAMYCODE,CODE ENTRY EXPORT__main __main MOVR0,#10 M…

P2Rank網頁端:預測蛋白結合口袋+vina分子對接

P2Rank 是一種基于機器學習的蛋白質口袋預測工具&#xff0c;用于識別蛋白質結構中的潛在配體結合位點。它采用了一種基于物理特征的打分方法&#xff0c;結合隨機森林&#xff08;Random Forest&#xff09;機器學習模型&#xff0c;以提高口袋預測的精確度。 該程序有在線工具…

安裝windows server 2016沒有可選硬盤,設備安裝過ubuntu系統

如果在安裝 Windows Server 2016 時無法識別已安裝過 Ubuntu 的硬盤&#xff0c;可能是由于硬盤分區格式&#xff08;如 ext4&#xff09;與 Windows 不兼容&#xff0c;或缺少必要的驅動程序。以下是詳細的解決方案&#xff1a; 1. 檢查 BIOS/UEFI 設置 確認硬盤模式 ? 重啟電…

Debian系統_主板四個網口1個配置為WAN,3個配置為LAN

Debian系統_主板四個網口1個配置為WAN&#xff0c;3個配置為LAN 一、重新配置網口 1、查看當前網口的狀態 ifconfig 或者 ip link show 或者 ls /sys/class/net 2、修改網絡配置文件 sudo vi /etc/network/interfaces 注意WAN口的網關地址如果是192.168.3.1的話&#xff0c;L…

springboot整合Thymeleaf web開發出現Whitelabel Error Page

背景 在做java端上應用開發的時候&#xff0c;從資源和部署操作成本兩方面考慮&#xff0c;一般會將前端的靜態資源直接與后端應用一起打包&#xff0c;通過springboot內嵌的Tomcat提供web服務。進入web首頁登錄一直到后續業務流程正向操作&#xff0c;頁面都能正常加載靜態資…

JavaScript元素尺寸與位置

目錄 client 家族與 offset 家族 一、client 家族&#xff1a;內容區域 內邊距 示例代碼 應用場景 二、offset 家族&#xff1a;內容區域 內邊距 邊框 滾動條 示例代碼 應用場景 三、綜合應用場景 1. 動態調整元素高度 2. 拖拽元素 3. 判斷元素是否在視口內 四…

GZ073網絡系統管理賽項賽題第1套模塊A:網絡構建解題筆記

2. 設備 接口或VLAN VLAN名稱 二層或三層規劃 說明 S1 VLAN10 CAIWU Gi0/1至Gi0/4 財務部 VLAN20 XIAOSHOU Gi0/5至Gi0/8 銷售部 VLAN30 YANFA Gi0/9至Gi0/12 研發部 VLAN40 SHICHANG Gi0/13至Gi0/16 市場部 VLAN50 AP Gi0/20至Gi0/21 無線AP管理 VL…

jmeter web壓力測試 壓測

下載地址 Apache JMeter - Download Apache JMeter 1. 設置線程組 2. 設置http請求頭 3. 設置http請求體 4. 設置結果條目 常用函數 ${__RandomString(8, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789)}${__javaScript( ${__Random(1000, 10000)} /…