POJ 3414 Pots(廣搜,路徑輸出,經典)

2021-10-08 15:40:32 字數 1385 閱讀 7929

廣搜, 參考

題目意思:

給出兩個壺的容量a和b, 乙個目標水量c,對a、b可以有3種操作,求最少經過幾步操作能夠在某個壺中得到目標水量c。

輸入a、b和c,輸入最少運算元和操作過程。

本題要點:

1、狀態表示:

把a和b壺中水量作為狀態,初始狀態為<0,0>,每個操作都是狀態變化的過程。因為有2個壺,所以總共有6種操作。

vis[i][j] 表示第乙個水杯裝i, 第二個水杯裝j 的狀態是否出現過。

2、用廣搜,搜尋可能出現的狀態, 如果 存在某個狀態,a水杯或者b水杯的水量 等於 c,說明存在一定的步驟。否則 impossible。

某種個狀態 node f 的下乙個狀態,可能向 6 種操作發展。

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

110;

int a, b, c;

bool vis[maxn]

[maxn]

;//vis[i][j] 表示第乙個水杯裝i, 第二個水杯裝j 的狀態是否出現過

struct node

;string path=

;void

print_res

(int cnt,

char p,

int n)

}void

bfs(

) node v = f;

v.level++

; v.pre++;if

(a > f.a)

// fill(a)}if

(b > f.b)

//fill(b)}if

(f.a)

//drop(a)}if

(f.b)

//drop(b)}if

(f.a && f.b < b)

//pour(a,b)

elseif(

!vis[v.a]

[v.b])}

if(f.b && f.a < a)

// pour(b,a)

elseif(

!vis[v.a]

[v.b])}

}printf

("impossible\n");

}int

main()

/*3 5 4

*//*

6fill(2)

pour(2,1)

drop(1)

pour(2,1)

fill(2)

pour(2,1)

*/

POJ 3414 Pots(倒水問題 列印路徑)

分析這道題屬於倒水問題,思想不變,不過在此之上還需要列印路徑,需要在節點當中儲存操作o,還需要記錄每乙個節點的父親。include include include include includeusing namespace std const int n 100 10 int pot 2 c,vi...

POJ 1606 Jugs(廣搜,路徑輸出)

廣搜,路徑輸出 題目意思 給出兩個壺的容量a和b,乙個目標水量c,對a b可以有 種操作,求最少經過幾步操作能夠在某個壺中得到目標水量c。輸入a b和c,輸入最少運算元和操作過程。題目 和 poj 3414 一樣。本題要點 1 狀態表示 把a和b壺中水量作為狀態,初始狀態為 0,0 每個操作都是狀態...

POJ 3984 迷宮問題 (廣搜,列印路徑)

定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。input 乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。output 左上角到右下角的最短路徑,格式如樣例所示。sa...