Pots(bfs)(儲存路徑)

2021-10-08 17:52:55 字數 1182 閱讀 1236

題意:輸入的三個數a,b,c,a,b表示兩個缸的容量,可以經過以下操作,得到任意乙個缸裡的水是c即可,最少的操作。

操作:fill(1):給第乙個缸添滿水。

fill(2):給第二個缸添滿水。

drop(1):第乙個缸倒光。

drop(2):第二個缸倒光。

pour(1,2):用第乙個缸裡的水倒入第二個缸裡,如果第二缸不夠裝,剩下的還在第乙個缸裡。

pour(2,1):第二個缸裡水倒入第乙個缸裡。

思路:求最少步驟,bfs,六種情況,判斷是否存在過這種情況存入棧中,一開的話也是直接從零開始就六種情況。

**

就是pour倒水的時候注意剩不剩水。

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1005

;int a,b,c;

int vis[maxn]

[maxn]

;struct e

t,cur,ans;

intbfs()

if(!vis[a]

[cur.b])if

(!vis[cur.a]

[b])if(

!vis[0]

[cur.b])if

(!vis[cur.a][0

])if(

!vis[

(a-cur.a>=cur.b)

?cur.a+cur.b:a]

[(a-cur.a>=cur.b)?0

:cur.b-a+cur.a])if

(!vis[

(b-cur.b>=cur.a)?0

:cur.a+cur.b-b]

[(b-cur.b>=cur.a)

?cur.a+cur.b:b])}

return0;

}int

main()

}else

printf

("impossible\n");

return0;

}

Poj 3414 Pots(BFS 列印路徑)

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

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

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

POJ 3414 Pots BFS記錄最短路徑

poj3414 給出了兩個瓶子1號和2號的容量分別為a和b,以及乙個目標水量c,對兩個瓶子有如下操作 fill i 把i號瓶子裝滿 drop i 把i號瓶子倒光 pour i,j 把i號瓶子的水倒入j號瓶子,直到i號瓶子水倒光或者j號瓶子被倒滿 問至少經過幾次操作使任一瓶子的水量為c,並記錄任一條最...