洛谷P3638 機械人

2022-06-13 14:36:10 字數 2103 閱讀 4290

vri(voltron 機械人學會)的工程師建造了 n 個機械人。任意兩個相容的機 器人站在同乙個格仔時可以合併為乙個復合機械人。

我們把機械人用 1 至 n 編號(n ≤ 9)。如果兩個機械人的編號是連續的,那 麼它們是相容的,可以合併成乙個復合機械人。最初這 n 個機械人各自都只有唯 一的編號。而乙個由兩個或以上的機械人合併構成的復合機械人擁有兩個編號, 分別是構成它的所有機械人中最小和最大的編號。

例如,2 號機械人只可以與 1 號或 3 號機械人合併。若 2 號機械人與 3 號機 器人合併,可構成編號為 2-3 的復合機械人。如果編號為 2-3 的復合機械人與編 號為 4-6 的復合機械人合併,可構成編號為 2-6 的復合機械人。當所有機械人合 並以後則構成 1-n 復合機械人。

工程師把這 n 個機械人放在了乙個封閉的房間中,房間四周均是牆。該房間 被劃分成 w × h 個方格。有些方格有障礙物,機械人不可經過或停留;其餘方格 允許多個機械人停留,同時允許機械人經過。任何時候乙個機械人只占用乙個方 格。初始時刻,所有機器人均在不同的方格中。

這些原始的機械人不會自發地移動。它們只有被工程師沿 x 軸或 y 軸推動 後,才會沿推動的方向不斷向前直線移動,直至碰到障礙物或牆停止移動。停止 移動後,它會掃瞄當前的格仔是否存在可以與它合併的機械人,如果有,則合併 並繼續檢查,直至不能再合併為止。工程師只能沿水平向左、水平向右、豎直向 上、豎直向下四個方向推動機械人,並且,在機械人尚未停止移動時,不允許推 動其它機械人,因此任何時刻,房間中都只能有乙個機械人移動。

為了幫助機械人轉向,工程師在一些格仔中放置了轉向器。具體地說,轉向 器分為順時針轉向器(右轉器)和逆時針轉向器(左轉器),順時針轉向器可以 使到達該格仔的機械人沿順時針方向轉向 90°;逆時針轉向器可以使到達該格 子的機械人沿逆時針方向轉向 90°。

現在,我們將告訴你初始時刻房間內的資訊。請你計算工程師最少共計需要 推動機械人多少次,才能把所有的 n 個機械人全部合併(如果可能的話)。

n ≤ 9,w ≤ 500,h ≤ 500。

先預處理出每乙個位置從任意方向出發會到達哪個點。這部分可以記憶化搜尋。

設 \(f[i][j][k]\) 表示區間 \([i,j]\) 的機械人全部到點 \(k\) 的最少操作次數。那麼有兩種轉移:

當 \(k\) 相同的時候,內部進行轉移

\[f[i][j][k]=\min^_(f[i][l][k]+f[l+1][j][k])

\]當 \(k\) 不同的時候,外部進行轉移

\[f[i][j][k]+1\to f[i][j][\mathrm_]

\]其中 \(\mathrm_\) 表示從 \(k\) 出發,方向為 \(l\) 最終會到達的位置。

雖然第二個轉移是有環的,且滿足三角形不等式。但是我們發現其實這兩個轉移顯然就是斯坦納樹的轉移。所以我們可以用 spfa 來進行轉移。

直接跑 spfa 是過不了的。這道題需要一定的卡常。我們發現邊權均為 \(1\),所以直接用兩個佇列儲存初始位置的狀態和轉移到的位置的狀態,每次取兩個隊頭的較小值來轉移即可。其實這就是乙個 bfs。具體可以見**。

時間複雜度 \(o(nmk^3)\)。

由於這道題相對卡常,所以**可能十分不美觀。

陣列建議把範圍小那一維的放在前面,因為這樣可以讓更多的記憶體連續,加快速度。

#include using namespace std;

const int n=505,m=11,inf=1e9;

const int dx[4]=,dy[4]=;

int n,r,c,lim,ans,q1[n*n*8],q2[n*n*8],nxt[4][n*n],f[m][m][n*n],cnt[n*n*36];

bool vis[4][n][n];

char a[n][n];

inline int id(int x,int y)

int dfs(int x,int y,int k)

if (a[x][y]=='a')

if (a[x][y]=='c')

vis[k][x][y]=0;

return nxt[k][id(x,y)];

}inline void bfs(int l,int r) }}

void solve()

}int main()

洛谷P1126 機械人搬重物

機械人移動學會 rmi 現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑1.6公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個n m的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方。機械人接受的指令有 向前移動1...

洛谷P1126 機械人搬重物

機械人移動學會 rmi 現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑 1.6 公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個 n m 的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方。機械人接受的指令有 向...

P1126機械人搬重物 洛谷

機械人移動學會 rmi 現在正嘗試用機械人搬運物品。機械人的形狀是乙個直徑 1.6 公尺的球。在試驗階段,機械人被用於在乙個儲藏室中搬運貨物。儲藏室是乙個 n mn times mn m 的網格,有些格仔為不可移動的障礙。機械人的中心總是在格點上,當然,機械人必須在最短的時間內把物品搬運到指定的地方...