南陽oj 題目21 三個水杯

2021-07-31 21:48:32 字數 1761 閱讀 5232

時間限制: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

┭┮﹏┭┮

最笨的方法廣搜,對杯子的水進行相互倒水,情況有(1->2)(2->1)(1->3)(3->1)(2->3)(3->2)六種情況,用佇列儲存每次轉移後的狀態,進行轉移,知道找到目標狀態就結束,或沒有找到(-1)結束.當然如果目標狀態的水杯水量和原來的水量不一樣就沒必要在經行搜尋轉移了。

特別注意的就是在轉移過程中,會有將乙個水杯的水全部倒入乙個杯子和,將另乙個杯子倒滿,杯子有剩餘,兩種情況。

#include

#include

#include

#include

#include

using namespace std

;struct node

as,t,h;

int a[110][110][110];

int n,m,k,n1,m1,k1;

queuep;

void dfs()

if(h.x!=0&&h.y!=m)//從第乙個向第二個倒水

else//如果第二個杯子能放下

t.z=h.z

; if(a[t.x][t.y][t.z]==0)//判斷這種情況是否存在

}if(h.y!=0&&h.x!=n)//從第二個杯子向第乙個杯子倒水

else

t.z=h.z

; if(a[t.x][t.y][t.z]==0)

}if(h.x!=0&&h.z!=k)//從第乙個杯子向第三個杯子倒水

else

t.y=h.y

; if(a[t.x][t.y][t.z]==0)

}if(h.z!=0&&h.x!=n)//從第三個杯子向第乙個杯子倒水

else

t.y=h.y

; if(a[t.x][t.y][t.z]==0)

}if(h.y!=0&&h.z!=k)//第二個向第三個杯子倒水

else

t.x=h.x

; if(a[t.x][t.y][t.z]==0)

}if(h.z!=0&&h.y!=m)//第三個杯子向第二個杯子倒水

else

t.x=h.x

; if(a[t.x][t.y][t.z]==0)}}

printf("-1\n");

}int main()

return 0

;}

南陽 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...

BFS NYOJ 21 三個水杯

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