POJ 3414 Pots BFS記錄最短路徑

2021-07-27 05:12:48 字數 1339 閱讀 7955

poj3414

給出了兩個瓶子1號和2號的容量分別為a和b, 以及乙個目標水量c,對兩個瓶子有如下操作:

fill(i):把i號瓶子裝滿

drop(i) :把i號瓶子倒光

pour(i,j):把i號瓶子的水倒入j號瓶子,直到i號瓶子水倒光或者j號瓶子被倒滿

問至少經過幾次操作使任一瓶子的水量為c,並記錄任一條最短操作路徑(special judge)。若不可能達到則輸出impossible。

本題本質仍是求最短步數,用bfs解決。

狀態為同一時刻兩個瓶子的容量,因此需要用二維陣列儲存。

狀態的擴充套件見下圖:

本題的難點在於還要輸出一條路徑。處理方法是在代表答案的結構體陣列中加乙個pre分量,記錄該狀態是由哪乙個狀態進行操作擴充套件而來的,因此還要對每一狀態進行編號。

#include 

#include

#include

#include

#define maxv 102

using namespace std

;struct node

;struct

ans[1000];//此陣列用來輸出路徑,ans[i]記錄i號狀態是由ans[i].pre狀態進行ans[i].op操作而變來的

int a,b,c,cnt=0

;bool vis[maxv][maxv];

string p[1000];

void bfs()

//由於這樣訪問的操作是倒序的,因此先存入到p陣列,最後再倒序輸出

for (int i=x

;i>=1;i--)

cout

return;

}node temp2;

/*fill(1)*/

if (temp.va!=a)

}/*fill(2)*/

if (temp.vb!=b)

}/*drop(1)*/

if (temp.va!=0)

}/*drop(2)*/

if (temp.vb!=0)

}/*pour(1,2)*/

if (temp.va!=0&&temp.vb!=b)

else

if (!vis[temp2.va][temp2.vb])

}/*pour(2,1)*/

if (temp.vb!=0&&temp.va!=a)

else

if (!vis[temp2.va][temp2.vb])}}

cout<

return;

}int main()

Poj 3414 Pots(BFS 列印路徑)

題意 給你兩個水杯的容積和乙個數m,讓你在任意乙個水杯中倒出乙個m,求最小步數,和輸出路徑。六種操作。題解 bfs六種操作。然後記錄路徑。用dfs反向查詢路徑。博主的方法比較笨,手寫了乙個佇列,然後記錄當前步是由佇列中那一步到達的。具體看 實現。include include includeusin...

poj 3414 pots(bfs暴力 路徑記錄)

思路 這可真是我目前寫過最長的題目了,雖然很多可以複製 學藝不精t t 其實思路還是很簡單的,就是6種情況,各種倒來倒去,然後記錄下路徑,我的方法是用一張圖來表示,有沒有走到過,然後圖上每個位置都存著父節點的位置,以及父節點怎麼達到,如果找到了逆序輸出,如果沒找到impossible,具體的看 吧 ...

poj解題報告 3414

題目大意 有二個水壺,對水壺有三種操作,1 fill i 將i水壺的水填滿,2 drop i 將水壺i中的水全部倒掉,3 pour i,j 將水壺i中的水倒到水壺j中,若水壺 j 滿了,則 i 剩下的就不倒了,問進行多少步操作,並且怎麼操作,輸出操作的步驟,兩個水壺中的水可以達到c這個水量。如果不可...