搜尋 poj3414倒水問題

2021-09-25 17:59:07 字數 858 閱讀 2222

題意:給出a,b兩個水杯的容量,和乙個要達到的水量c。總共3種操作,兩個杯子那就是六種。要求通過這六種操作來時兩個杯子其中有乙個水量為c的最少運算元。

解題思路:這道題用到的是廣搜bfs,水量(i,j)代表乙個點,通過這六種操作可以變成另乙個點,那麼這兩個點之間就是有路的,每個點有沒有訪問過用鄰接矩陣vis【i】【j】儲存。

**如下:

#include#include#include#include#define n 105

using namespace std;

int a, b, c;

int vis[n][n];

struct node ;

char path[6][10] = ;

void out( char p, int n)

node v;

v = f;

v.plen++;

//fill(a)

if (a - f.a > 0)

}//fill(b)

if (b - f.b > 0)

}//drop(a)

if (f.a)

}//drop(b)

if (f.b)

}//pour(a,b)

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

else

if (!vis[v.a][v.b])

}//pour(b,a)

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

else

if (!vis[v.a][v.b])

}} cout << "impossible" << endl;

}int main()

poj 3414 倒水問題 bfs

思路 就是bfs,有六種操作,fill 1或2,drop 1或2 將1倒到2,將2倒到1。要注意的是要使用標記陣列vis i j 表示左邊的杯子為i公升,右邊的杯子為j公升,如果已被標記說明之前已經出現這種情況,就不要入隊。從 0,0 開始bfs。因為題目中需要輸出如何倒,那麼就需要儲存路徑。以前似...

POJ3414解題報告

include includeconst int maxn 110 int vis maxn maxn 標記狀態是否入隊過 int a,b,c 容器大小 int step 最終的步數 int flag 紀錄是否能夠成功 狀態紀錄 struct statusq maxn maxn int id max...

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

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