1448 例題1 電路維修

2022-04-12 03:39:09 字數 1792 閱讀 8673

樣例樣例輸入                                             樣例輸出

3 5                                    1

\\/\\

\\///

/\\\\

題解我們可以把電路板上的每個格點(橫線與豎線的交叉點)看作無向圖中的結點。     

若兩個結點x和y是某個小方格的兩個對角,則在x與y之間連邊。若該方格中的標準件(對角線)與x到y的線段重合,則邊權為0;若垂直相交,則邊權為1(說明需要旋轉1次才能連通)。然後,我們在這個無向圖中求出從左上角到右下角的最短距離,就得到了結果。

這是乙個邊權要麼是0,要麼是1的無向圖。在這樣的圖上,我們可以通過雙端佇列廣度搜尋計算。

分支邊權為1,從隊尾入

分支邊權為0,從隊首入

保證兩段性和單調性

因為每個節點只需要訪問一次,所以演算法的時間複雜度為o(r×c)

注釋

1.make_pair的用法無需寫出型別, 就可以生成乙個pair物件 

例:make_pair(42,『%』);

而不必費力寫成: 

pair(42,『%』)

2.  if((r+c)%2) 那麼無解

畫個圖理解一下就好了,畢竟你是要走對角線

**

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int cap=500010

;int dist[510][510

];//兩點間的最短距離

char map[510][510

]; //讀圖

pair

q[cap*2

]; //佇列

intr,c,li,ri;

inline

bool valid(int x,int y) //

是否出界

inline

void que_add(int x,int y,int

v)

}int

main()

else

if(valid(cx-1,cy-1

))

if(valid(cx+1,cy-1

))

if(valid(cx+1,cy+1

))

}printf(

"%d\n

",dist[r][c]);}}

return0;

}

1465 例題1 剪花布條

1465 例題1 剪花布條 時間限制 1000 ms 記憶體限制 65536 kb 提交數 1124 通過數 727 題目描述 原題來自 hdu 2087 一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?輸...

1433 例題1 憤怒的牛

題解 this is an er fen ti.由題意可得 它是求最小值最大的問題 我們假設 每兩頭牛之間的最小距離為 d 也就是每兩頭牛之間的距離 d 問題也就是求這個 d 最大是多少 理一理思路 1.對所有的牛舍從小到大排序 2.假設我們把第 i 頭牛放在 ai 號牛舍裡,那麼第 i 1 頭牛就...

1440 例題1 數的劃分 dfs剪枝

1440 例題1 數的劃分 時間限制 1000 ms 記憶體限制 65536 kb 提交數 1607 通過數 1059 題目描述 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。問有多少種不同的分法。輸出乙個整數,即不同的分法。輸入 ...