AtCoder Beginner Contest 420-Toggle Maze

題目描述
有一個 H行 W 列的網格。用 (i,j) 表示位于第 i 行(從上往下數)第 j 列(從左往右數)的格子。每個格子的狀態用字符 Ai,j表示,含義如下:

. :空格子。
#’ :障礙格子。
S :起點格子。
G :終點格子。
o :開著的門格子。
x :關著的門格子。
? :開關格子。
高橋君可以從當前格子移動到上下左右相鄰的格子,但不能移動到障礙格子或關著的門格子,每次移動算一次操作。

而且,每當他走到一個開關格子時,所有開著的門都會變成關著的門,所有關著的門都會變成開著的門。

請判斷他是否能從起點出發,最終到達終點;如果能,求出最少需要多少次操作。

約束條件1≤H,W≤5001≤H,W≤500HH 和 WW 是整數。每個 Ai,jAi,j? 都是 .、#、S、G、o、x、?和Ai,jA i,j中各出現且僅出現一次。輸入格式輸入從標準輸入給出,格式如下:

H
H
W
W
A
1
,
1
A
1
,
2
?
A
1
,
W
A
1,1
?
A
1,2
?
?A
1,W
?

A
2
,
1
A
2
,
2
?
A
2
,
W
A
2,1
?
A
2,2
?
?A
2,W
?

?
?
A
H
,
1
A
H
,
2
?
A
H
,
W
A
H,1
?
A
H,2
?
?A
H,W
?

輸出格式
如果高橋君能從起點移動到終點,輸出最少的操作次數;否則輸出 -1。

樣例 1
Input
2 4
S.xG
#?o.
Output
5
通過依次從 (1,1)
(1,1) 移動到 (1,2),(2,2),(1,2),(1,3),(1,4)
(1,2),(2,2),(1,2),(1,3),(1,4),他可以在五步內到達終點。

樣例 2
Input
1 5
So?oG
Output
-1
無論怎么走,都無法到達終點,因此輸出 ?1
?1。

樣例 3
Input
5 5
Sx?x?
o#o#x
?o?o?
x#x#o
?x?oG
Output
10

解題思路

  • 網格中的格子類型如下:
  • .:空地,可以自由移動。
  • #:墻,不可通過。
  • S:起點。
  • G:終點。
  • o:需要特定狀態才能通過(狀態為 0 時可通過)。
  • x:需要特定狀態才能通過(狀態為 1 時可通過)。
  • ?:切換當前狀態(0 和 1 之間切換)。
  • BFS 需要記錄當前位置和當前狀態(0 或 1),因為狀態會影響某些格子的通行性。

代碼分析

變量定義

  • a[N][N]:存儲網格的二維數組,每個格子用數字表示類型。
  • dis[N][N][2]:記錄從起點到每個位置 (i,j) 在狀態 0 或 1 時的最短步數。
  • dx[5] 和 dy[5]:四個方向的移動增量(右、左、下、上)。
  • sx, sy:起點坐標。
  • ex, ey:終點坐標。

BFS 實現

  • 從起點 (sx, sy) 開始,初始狀態為 0。每次從隊列中取出當前位置和狀態,嘗試向四個方向移動:
  • 如果移動后的位置是空地或終點,直接更新步數。
  • 如果移動后的位置是 o 或 x,檢查當前狀態是否允許通過。
  • 如果移動后的位置是 ?,切換狀態并更新步數。
  • 如果移動后的位置是墻或非法位置,跳過。

輸出結果

  • 檢查終點 (ex, ey) 在狀態 0 和 1 時的最短步數,取較小值輸出。如果無法到達,輸出 -1。
  • 代碼優化與注意事項
  • 使用 0x3f 初始化 dis 數組,表示無窮大。
  • 使用 array<int, 3> 存儲隊列元素(坐標 x, y 和狀態 st)。
  • 提前剪枝:如果到達終點,跳過后續處理。

復雜度分析

  • 時間復雜度:O(n*m),每個位置和狀態最多被訪問一次。
  • 空間復雜度:O(n*m),用于存儲 dis 數組和隊列。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e2+15;
int a[N][N],n,m;
int dis[N][N][2],sx,sy,ex,ey;
int dx[5]={0,0,1,-1};
int dy[5]={1,-1,0,0};
void bfs(int x,int y)
{dis[x][y][0]=0;queue<array<int,3>>q;q.push({x,y,0});while(!q.empty()){array<int,3>j1=q.front();// cout<<j1[0]<<" "<<j1[1]<<'\n';q.pop();if(j1[0]==ex&&j1[1]==ey)continue;for(int i=0;i<=3;i++){array<int,3>jj1;jj1[0]=j1[0]+dx[i];jj1[1]=j1[1]+dy[i];int xx=jj1[0];int yy=jj1[1];if(xx<1||yy<1||xx>n||yy>m)continue;if(a[xx][yy]==0||(j1[2]&&a[xx][yy]==5)||(!j1[2]&&a[xx][yy]==4)||a[xx][yy]==3||a[xx][yy]==2){if(dis[xx][yy][j1[2]]>dis[j1[0]][j1[1]][j1[2]]+1){dis[xx][yy][j1[2]]=dis[j1[0]][j1[1]][j1[2]]+1;q.push({xx,yy,j1[2]});}}else if(a[xx][yy]==6){if(dis[xx][yy][!j1[2]]>dis[j1[0]][j1[1]][j1[2]]+1){dis[xx][yy][!j1[2]]=dis[j1[0]][j1[1]][j1[2]]+1;q.push({xx,yy,!j1[2]});}}}}
}
signed main()
{ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int sum=0;char c;cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>c;if(c=='.')a[i][j]=0;if(c=='#')a[i][j]=1;if(c=='S')sx=i,sy=j,a[i][j]=2;if(c=='G')ex=i,ey=j,a[i][j]=3;if(c=='o')a[i][j]=4;if(c=='x')a[i][j]=5;if(c=='?')a[i][j]=6;}memset(dis,0x3f,sizeof(dis));bfs(sx,sy);if(min(dis[ex][ey][0],dis[ex][ey][1])==4557430888798830399)cout<<"-1";elsecout<<min(dis[ex][ey][0],dis[ex][ey][1]);return 0;
}

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

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

相關文章

20、DMA----釋放CPU壓力,加快傳輸

1、DMA介紹DMA&#xff0c;全稱為&#xff1a;Direct Memory Access&#xff0c;即直接存儲器訪問。DMA傳輸方式無需CPU直接控制傳輸&#xff0c;也沒有中斷處理方式那樣保留現場和恢復現場的過程&#xff0c;通過硬件為RAM與I/O設備開辟一條直接傳送數據的通路&#xff0c;能使…

深入OpenHarmony OTA硬核升級

技術背景 OpenHarmony OTA(Over-The-Air)升級子系統為設備提供了遠程升級能力,通過統一的升級接口屏蔽底層芯片差異,支持輕量系統、小型系統和標準系統的全量升級、差分升級和變分區升級。 核心特性 跨系統支持:覆蓋輕量系統(Hi3861)、小型系統(Hi3516DV300)、標準系…

華為iVS1800接入SVMSPro平臺

華為iVS1800接入SVMSPro平臺 ** 華為好望Huawei HolosensIVS1800智能視頻云平臺采用首款昇騰310加持的嵌入式系統智能微邊緣&#xff0c;獨俱普惠AI鴻力。一臺融合存儲、計算、檢索功能&#xff0c;滿足小型園區、社區、銀行網點、超市等場景安防需求&#xff0c;小機大智。 …

《異形戰機2》v2.0.4數字豪華版,3D橫版射擊再臨,機體武器海量升級

[游戲名稱]: 《異形戰機2》v2.0.4數字豪華版 [軟件大小]: 17.7 GB [軟件大小]: 夸克網盤 | 百度網盤 游戲介紹 《異形戰機&#xff1a;最終版2》續作震撼登場&#xff01;經典橫版射擊全面升級&#xff1a;3D 畫面炫目、關卡與機體海量擴充&#xff0c;只為帶來酣暢淋漓的滅…

Java 異常(Throwable)

1. Throwable Throwable: 所有異常和錯誤的根類。實現 Throwable 或其子類的對象才能被 throw 或 catch。 Error: 表示嚴重的系統級問題&#xff0c;通常不應該被捕獲或處理&#xff0c;程序通常無法從中恢復。 Exception: 表示程序可以處理的問題。分為 運行時異常、 受檢異常…

rocketmq常用命令

官方文檔 https://rocketmq.apache.org/zh/docs/ https://rocketmq.apache.org/zh/docs/domainModel/02topic/ https://rocketmq.apache.org/zh/docs/4.x/deployment/02admintool 集群配置管理 https://mp.weixin.qq.com/s/688wNSwZPraGvAnr0K7hRw RocketMQ運維管理命令mqadm…

【C++詳解】哈希表概念與實現 開放定址法和鏈地址法、處理哈希沖突、哈希函數介紹

文章目錄一、unordered系列的使用unordered_set類的介紹unordered_set和set的使?差異unordered_map和map的使?差異unordered_xxx的哈希相關接?二、哈希表實現哈希概念直接定址法哈希沖突負載因?將關鍵字轉為整數哈希函數除法散列法/除留余數法乘法散列法處理哈希沖突開放定…

電影感人文街拍擺攤紀實攝影后期Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色介紹電影感人文街拍擺攤紀實攝影后期 Lr 調色是一種專注于捕捉街頭生活煙火氣的攝影風格&#xff0c;通過 Lightroom 后期調色賦予畫面電影般的敘事感和情感深度。這種風格以擺攤小販、市井行人、街頭場景為主體&#xff0c;強調真實、自然的生活瞬間。調色核心在于低飽和暖…

【數據分享】298個地級市人工智能企業數量(1990-2023)

數據介紹引言人工智能產業作為數字經濟的核心驅動力&#xff0c;其發展規模與分布格局深刻反映區域科技創新活力與產業升級潛力。為助力相關研究&#xff0c;本文分享一份涵蓋全國 298 個地級市 1990-2023 年的人工智能企業核心數據&#xff0c;包含人工智能企業存量和人工智能…

LeetCode 面試經典 150_雙指針_驗證回文串(25_125_C++_簡單)(雙指針)

LeetCode 面試經典 150_數組/字符串_驗證回文串&#xff08;25_125_C_簡單&#xff09;題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;雙指針&#xff09;&#xff1a;代碼實現代碼實現&#xff08;思路一&#xff08;雙…

無障礙輔助模塊|Highcharts引領可訪問數據可視化的交流

在現代數據可視化中&#xff0c;無障礙輔助技術已成為必不可少的一部分。對于視障人士或使用屏幕閱讀器的用戶來說&#xff0c;傳統圖表往往難以獲取有效信息&#xff0c;而 Highcharts 在設計之初便充分考慮了無障礙體驗。 Highcharts作為可訪問數據可視化的倡導者&#xff0…

從0到1:數據庫進階之路,解鎖SQL與架構的奧秘

目錄一、SQL 基礎啟航1.1 SQL 基礎語法1.2 SQL 進階查詢1.3 SQL 實戰案例分析二、分庫分表實戰2.1 分庫分表的背景與原理2.2 分庫分表策略設計2.3 分布式 ID 生成2.4 數據遷移方案三、中間件實戰3.1 中間件概述3.2 DBLE 中間件實戰3.3 MyCat 中間件實戰四、高可用架構搭建4.1 高…

【數據結構入門】排序算法(2):直接選擇排序->堆排序

目錄 1.直接選擇排序 1.1 思想 1.2 代碼 2.堆排序 2.1 向下調整算法 2.1.1 代碼 2.2 建堆 2.2.1 代碼 2.3 正式排序 2.3.1 代碼 3. 冒泡排序 3.1 思路 3.1.1 單趟排序 3.1.2 多趟排序 3.1.3優化 3.2 代碼 1.直接選擇排序 1.1 思想 每次從未排序區中選擇一個最小…

Fluent Bit系列:字符集轉碼測試(下)

#作者&#xff1a;程宏斌 文章目錄fluent-bit 1.9.4 轉換測試結論接上篇&#xff1a;《Fluent Bit系列&#xff1a;字符集轉碼測試&#xff08;上&#xff09;》https://blog.csdn.net/qq_40477248/article/details/150776142?spm1001.2014.3001.5501fluent-bit 1.9.4 轉換測試…

redis-緩存-持久化

redis-緩存-持久化一、來因宮1、啥叫持久化&#xff1f;為何需要持久化&#xff1f;2、redis持久化方案2.1、RDB - 快照持久化A、定義原理B、快照生成流程&#xff1a;Copy-on-Write&#xff08;寫時復制&#xff09;C、dump.rdb文件說明D、RDB 數據恢復流程E、RDB的優缺點2.2、…

C++11(Linux/GCC)字節序工具

#pragma once #include <cstdint> #include <climits> #include <type_traits> // 用于類型檢查// 端序宏獲取&#xff08;保持原有邏輯&#xff09; #if __has_include(<endian.h>)#include <endian.h> #elif __has_include(<bits/endian.h…

【MTCNN網絡結構記憶卡片】--003nets.py

&#x1f9e0; MTCNN網絡結構記憶卡片 &#xfffd;&#xfffd; 基礎概念速查 &#x1f524; 庫引入&#xff1a;import torch 和 import torch.nn as nn import torch # PyTorch深度學習框架 import torch.nn as nn # nn Neural Networks (神經網絡)&#x1f3d7;?…

可視化-模塊1-HTML-03

1.發現問題<p>大數據可視化技術及應用課程</p> <img src"pic/圖片2.png" width"300" height"300"/><p></p><img />HTML 標簽按閉合方式只分兩類&#xff1a;雙標簽&#xff08;paired / container&#xff…

前端開發:詳細介紹npm、pnpm和cnpm分別是什么,使用方法以及之間有哪些關系

目錄 npm、pnpm和cnpm分別是什么 npm pnpm cnpm NPM包管理器 使用npm管理&#xff0c;創建/初始化項目 修改npm鏡像&#xff08;npm源設置&#xff09; 基本命令 安裝依賴項 下載特定版本的依賴 下載開發依賴 下載全局依賴&#xff08;全局安裝&#xff09; 升級依賴項 根據依賴…

我們為你連接網絡,安裝驅動程序

Windows 11 家庭版/專業版在安裝時默認要求聯網&#xff0c;其實可以跳過。在這個聯網界面按下 Shift F10 打開命令行。輸入以下命令并回車&#xff1a;OOBE\BYPASSNRO系統會自動重啟&#xff0c;回到聯網界面。這時會多出一個 “我沒有 Internet” 選項&#xff0c;點它&…