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這個水量。如果不可...