每周一算法:雙端隊列廣搜

題目鏈接

電路維修

題目描述

達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。翰翰的家里有一輛飛行車。有一天飛行車的電路板突然出現了故障,導致無法啟動。

電路板的整體結構是一個 R R R C C C列的網格( R , C ≤ 500 R,C≤500 R,C500),如下圖所示:
在這里插入圖片描述
每個格點都是電線的接點,每個格子都包含一個電子元件。電子元件的主要部分是一個可旋轉的、連接一條對角線上的兩個接點的短電纜。在旋轉之后,它就可以連接另一條對角線的兩個接點。電路板左上角的接點接入直流電源,右下角的接點接入飛行車的發動裝置。

達達發現因為某些元件的方向不小心發生了改變,電路板可能處于斷路的狀態。她準備通過計算,旋轉最少數量的元件,使電源與發動裝置通過若干條短纜相連。不過,電路的規模實在是太大了,達達并不擅長編程,希望你能夠幫她解決這個問題。

注意:只能走斜向的線段,水平和豎直線段不能走。

輸入描述

輸入文件包含多組測試數據。

第一行包含一個整數 T T T,表示測試數據的數目。對于每組測試數據,第一行包含正整數 R R R C C C,表示電路板的行數和列數。

之后 R R R行,每行 C C C個字符,字符是/\中的一個,表示標準件的方向。

輸出描述

對于每組測試數據,在單獨的一行輸出一個正整數,表示所需的縮小旋轉次數。
如果無論怎樣都不能使得電源和發動機之間連通,輸出NO SOLUTION

樣例輸入

1
3 5
\\/\\
\\///
/\\\\

樣例輸出

1

算法思想

根據題目描述,每個格子都包含一個電子元件,主要部分是一個可旋轉的、連接一條對角線上的兩個接點的短電纜,如下圖所示。

在這里插入圖片描述
旋轉一個電子元件的代價為 1 1 1,問最少旋轉幾個元件,使起點與終點通過若干條短纜相連。

連通性

由于只能走斜向的線段,水平和豎直線段不能走,所以選擇左上角的接點作為起點,只能連接如下圖(左)綠色的接點,二下圖(右)紅色的接點是無法連通的。
在這里插入圖片描述
通過分析發現,如果將起點設為左上角,那么能夠連接的點(綠色),其行列值的和為偶數。因此,是否使得電源和發動機之間連通,需要判斷 ( n + m ) (n+m) (n+m)是否為偶數。

最小代價

如果電子元件的最初狀態為下圖所示,那么從 A ? > B A->B A?>B的代價為 0 0 0,不需要旋轉;而從 C ? > D C->D C?>D的代價為 1 1 1,需要旋轉 1 1 1次。
在這里插入圖片描述
因此,求旋轉最少數量的元件,使電源與發動裝置通過若干條短纜相連,可以轉換為求從起點到終點,當連接的兩點之間代價為 0 0 0 1 1 1時的最短路。

雙端隊列廣搜

對于只包含邊權 0 0 0 1 1 1的最短路問題,可以使用雙端隊列廣搜求解。與普通的BFS不同的是:

  • 如果擴展到的新節點邊權為 0 0 0時,需要把新節點插入隊列的頭部。

這樣處理滿足BFS的兩個性質:

  • 兩段性:隊列中同時存在的所有點到起點的距離差值最多是1。
  • 單調性:隊列分成兩段,前面一定是小的

因此可以使用BFS求最短路。

代碼實現

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;typedef pair<int, int> PII;
const int N = 505;
char g[N][N];
int n, m, st[N][N], dis[N][N];//元件的偏移值:左上,右上,右下,左下
int dx[4] = {-1, -1, 1, 1}, dy[4] = {-1, 1, 1, -1};
//連接元件的電纜方向在字符數組位置的偏移值:左上,右上,右下,左下
int ix[4] = {-1, -1, 0, 0}, iy[4] = {-1, 0, 0, -1};
//不需要旋轉的連接方向,左上,右上,右下,左下
char c[] = "\\/\\/"; //"\/\/"
int bfs()
{memset(st, 0, sizeof st);memset(dis, 0x3f, sizeof dis);deque<PII> q;dis[0][0] = 0; q.push_back({0, 0});while(q.size()){PII t = q.front(); q.pop_front(); //從隊頭出隊int x = t.first, y = t.second;if(st[x][y]) continue;st[x][y] = true;for(int i = 0; i < 4; i ++){//擴展到的元件左上角的行列值int a = x + dx[i], b = y + dy[i]; if(a < 0 || a > n || b < 0 || b > m) continue;int ai = x + ix[i], bi = y + iy[i];//元件方向在數組中的位置int w = g[ai][bi] != c[i]; //如果不是正確的連接方向,需要旋轉,邊權為1if(dis[a][b] > dis[x][y] + w){dis[a][b] = dis[x][y] + w;if(w == 1) q.push_back({a, b}); //邊權為1加入隊尾else q.push_front({a, b}); //邊權為0加入隊頭}}}return dis[n][m];
}
int main()
{int T;cin >> T;while(T --){cin >> n >> m;for(int i = 0; i < n; i ++) cin >> g[i];if(n + m & 1) {puts("NO SOLUTION");continue;}int t = bfs();if(t == 0x3f3f3f3f) puts("NO SOLUTION");else cout << t << '\n';}
}

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

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

相關文章

Java實戰:SpringBoot集成ZXing實現二維碼生成與解析

一、引言 在信息化社會&#xff0c;二維碼已經深入到生活的各個角落&#xff0c;無論是支付、營銷、信息傳遞&#xff0c;甚至防偽溯源&#xff0c;二維碼都發揮了至關重要的作用。作為Java開發者&#xff0c;我們如何在SpringBoot項目中便捷地實現二維碼的生成與解析呢&#…

4、Redis-Set【常用】

目錄 一、Redis-Set特點 二、常用命令與交并差 三、Redis中Set類型應用場景 一、Redis-Set特點 1、無序&#xff1a;添加的是A,B,C&#xff1b;取出的可能是B,A,C 2、唯一&#xff1a;不允許元素重復 二、常用命令與交并差 常用命令 格式含義例子sadd key members[...]往k…

吳恩達機器學習筆記十四 多輸出的分類 多類和多標簽的區別 梯度下降優化 卷積層

這里老師想講的是multiclass classification和multilable classification的區別&#xff0c;下面是我從其他地方找到的說法: Multiclass classification 多類分類 意味著一個分類任務需要對多于兩個類的數據進行分類。比如&#xff0c;對一系列的橘子&#xff0c;蘋果或者梨的…

Stable Diffusion生成式擴散模型代碼實現原理

Stable Diffusion可以使用PyTorch或TensorFlow等深度學習框架來實現。這些框架提供了一系列的工具和函數&#xff0c;使得開發者可以更方便地構建、訓練和部署深度學習模型。因此可以使用PyTorch或TensorFlow來實現Stable Diffusion模型。 安裝PyTorch&#xff1a;確保您已經安…

Linux命令行與shell腳本編程大全-2.2

第二部分 shell腳本編程基礎 第11章構建基礎腳本 第12章結構化命令 第13章更多的結構化命令 第14章處理用戶輸入 第15章呈現數據 第16章腳本控制 第15章 呈現數據 15.1 理解輸入和輸出 15.1.1 標準文件描述符 Linux 系統會將每個對象當作文件來處理&#xff0c;這包括輸入和…

T3SF:一款功能全面的桌面端技術練習模擬框架

關于T3SF T3SF是一款功能全面的桌面端技術練習模擬框架&#xff0c;該工具針對基于主場景事件列表的各種事件提供了模塊化的架構&#xff0c;并包含了針對每一個練習定義的規則集&#xff0c;以及允許為對應平臺參數定義參數的配置文件。 該工具的主模塊能夠執行與其他特定模…

CDN原理探究

來源于百度&#xff1a; https://baike.baidu.com/item/%E5%86%85%E5%AE%B9%E5%88%86%E5%8F%91%E7%BD%91%E7%BB%9C/4034265?frge_ala 通過上圖&#xff0c;我們可以了解到&#xff0c;使用了CDN緩存后的網站的訪問過程變為&#xff1a; 用戶向瀏覽器提供要訪問的域名&#xff…

幻獸帕魯/Palworld服務器的最佳網絡設置、內存和CPU配置是什么?

幻獸帕魯/Palworld服務器的最佳網絡設置、內存和CPU配置是什么&#xff1f; 對于4到8人的玩家&#xff0c;推薦的配置是4核16G的CPU和16G的內存。10到20人的玩家選擇8核32G的CPU和32G或以上的內存。2到4人的玩家則建議選擇4核8G的CPU和8G的內存。對于32人的玩家&#xff0c;推…

YOLOV8介紹

原文鏈接&#xff1a; 1、 詳解YOLOv8網絡結構/環境搭建/數據集獲取/訓練/推理/驗證/導出 2、Yolov8的詳解與實戰 3、YOLOV8模型訓練部署&#xff08;實戰&#xff09;&#xff08;&#xff09;有具體部署和訓練實現代碼YOLOV8模型訓練部署&#xff08;實戰&#xff09;&…

Mybatis plus核心功能-IService

目錄 1 前言 2 使用方法 2.1 繼承ServiceImpl,> 2.2 基礎業務開發的使用 2.3 復雜業務開發的使用 2.3 Lambda查詢 2.4 Lambda更新 1 前言 我本以為Mapper層的類能夠繼承BaseMapper<XXX>&#xff0c;而不用我們手動寫一些mapper方法已經夠離譜了。沒想到海油膏…

linux上pip3 install torch==1.11和pip3 install torch==1.11+cu115區別

在linux上安裝torch時&#xff0c; 如果環境安裝好了CUDA環境&#xff0c; 那么安裝torch時不用刻意指定帶cuda的版本&#xff0c; 最終安裝的也是支持GPU的torch版本。但是仍然有一些小的區別&#xff0c;主要就是支持CUDA版本的不同。 (leo_py37) pinefieldedge-gpu-01:/dat…

Gradle構建項目

1.自己下載對應的gradle版本到本地。 2.maven國內鏡像&#xff08;settings.gradle中進行配置&#xff09; // google()maven { url https://maven.aliyun.com/repository/public/ }maven { url https://maven.aliyun.com/repository/google/}maven { url https://maven.aliyu…

【機器學習300問】25、常見的模型評估指標有哪些?

模型除了從數據劃分的角度來評估&#xff0c;我上一篇文章介紹了數據集劃分的角度&#xff1a; 【機器學習300問】24、模型評估的常見方法有哪些&#xff1f;http://t.csdnimg.cn/LRyEt 還可以從一些指標的角度來評估&#xff0c;這篇文章就帶大家從兩個最經典的任務場景介紹…

Day08:基礎入門-算法分析傳輸加密數據格式密文存儲代碼混淆逆向保護

目錄 傳輸數據-編碼型&加密型等 傳輸格式-常規&JSON&XML等 密碼存儲-Web&系統&三方應用 代碼混淆-源代碼加密&逆向保護 思維導圖 章節知識點&#xff1a; 應用架構&#xff1a;Web/APP/云應用/三方服務/負載均衡等 安全產品&#xff1a;CDN/WAF/I…

【stata】漸進式雙重差分/交錯式雙重差分(staggered-DID) 實現過程

Staggered-DID 的實現 為保證本貼的簡潔性與一般適用性,本文并沒有使用現有真實數據,而是模擬了一個一般數據。如果你手中有正在處理好的project數據,可以跳過1.數據生成,直接從2.數據預加工開始。 1.數據生成 (1)數據生成過程 我將隨機生成一個數據來模擬staggered-DID…

leetcode 熱題 100_移動零

題解一&#xff1a; 雙指針遍歷&#xff1a;將非零的值往數組前端依次放置&#xff0c;將放置之后數組后端多余的位置都置為0&#xff0c;參考下圖&#xff08;來源. - 力扣&#xff08;LeetCode&#xff09;&#xff09; class Solution {public void moveZeroes(int[] nums)…

c語言的數據結構:隊列

1.隊列存在的實現方式及其存在意義 1.1為什么隊列使用單鏈表實現更好 動態內存分配&#xff1a;鏈表在C語言中通常使用動態內存分配&#xff0c;這意味著可以在運行時根據需要動態地添加或刪除節點。這對于實現一個動態大小的隊列非常有用&#xff0c;因為隊列的大小可以在運…

界面控件Telerik UI for ASP. NET Core教程 - 如何為網格添加上下文菜單?

Telerik UI for ASP.NET Core是用于跨平臺響應式Web和云開發的最完整的UI工具集&#xff0c;擁有超過60個由Kendo UI支持的ASP.NET核心組件。它的響應式和自適應的HTML5網格&#xff0c;提供從過濾、排序數據到分頁和分層數據分組等100多項高級功能。 上下文菜單允許開發者為應…

[unity] c# 擴展知識點其一 【個人復習筆記/有不足之處歡迎斧正/侵刪】

.NET 微軟的.Net既不是編程語言也不是框架,是類似于互聯網時代、次時代、21世紀、信息時代之類的宣傳口號,是一整套技術體系的統稱&#xff0c;或者說是微軟提供的技術平臺的代號. 1.跨語言 只要是面向.NET平臺的編程語言(C#、VB、 C、 F#等等)&#xff0c;用其中一種語言編寫…

帶著問題閱讀源碼——Spring MVC是如何將url注冊到RequestMappingHandlerMapping?

背景 在 Spring MVC 中&#xff0c;DispatcherServlet 是前端控制器&#xff08;front controller&#xff09;&#xff0c;它負責接收所有的 HTTP 請求并將它們映射到相應的處理器&#xff08;handler&#xff09;。為了實現這一點&#xff0c;Spring MVC 使用了適配器模式將…