BFS NYOJ 21 三個水杯

2021-06-18 10:33:36 字數 1268 閱讀 6024

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4 描述

給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。

輸入第一行乙個整數n(0v2>v3 v1<100 v3>0)表示三個水杯的體積。

第二行給出三個整數e1 e2 e3 (體積小於等於相應水杯體積)表示我們需要的最終狀態

輸出每行輸出相應測試資料最少的倒水次數。如果達不到目標狀態輸出-1

樣例輸入

2

6 3 1

4 1 1

9 3 2

7 1 1

樣例輸出

3

-1

唉...這道題寫了好久啊!

簡單的寬度優先搜尋,三個水杯之間的相互倒水如下圖6種情況:

對於每一次倒水都會引起三個水杯水量狀態的改變,這樣就可以得到如下的乙個解空間樹:

按照上圖中得到解空間樹的方法,**如下:

#include #include #include using namespace std;  

#define empty 0

struct data_type

; int cupcapacity[3], targetstate[3];

bool visited[100][100][100];

bool achievetargetstate(data_type current)

} return true;

} void pourwater(int destination, int source, data_type &cup)

else

} int bfs(void)

for (i = 0; i < 3; i++)

} }

} }

return -1;

} int main(void)

return 0;

}

引自:

BFS NYOJ 21 三個水杯

時間限制 1000ms 記憶體限制 65535kb 難度 4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入第一行乙個整數n ...

南陽 21 三個水杯

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入第一行乙個整數...

NYOJ21 三個水杯

題目分析 暴力 bfs。將所有可能的狀態壓到佇列中,直到找到目標狀態為止。我自己ac的 include include 三個水杯的盛水的狀態 struct node node queue 100 bool used 101 101 101 inline void pour node p,int ta...