nyoj三個水杯 bfs

2021-09-07 02:42:11 字數 1922 閱讀 4739

時間限制:

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

題解:bfs裡用兩個迴圈代表從j往i杯子裡倒水;

**:

1 #include2 #include

3 #include4

using

namespace

std;

5struct

node;

9int cup[3

];10

int res[3

];11

int vis[110][110

];12

void bfs(int sx,int sy,int

sz)27

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

28for(int j=0;j<3;j++)

37else

41if(b.wat[0]==res[0]&&b.wat[1]==res[1]&&b.wat[2]==res[2

])45

//printf("%d %d %d %d\n",b.wat[0],b.wat[1],b.wat[2],b.step);

46if(!vis[b.wat[0]][b.wat[1

]])dl.push(b);

47 vis[b.wat[0]][b.wat[1]]=1;48

}49}50

}51 puts("-1"

);52}53

intmain()

61return0;

62 }

bfs優化:

1 #include2 #include

3 #include4

using

namespace

std;

5struct

node

11};

12int cup[3

];13

int res[3

];14

int vis[110][110

];15

void bfs(int sx,int sy,int

sz)30

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

31for(int j=0;j<3;j++)

40else

44if(b.wat[0]==res[0]&&b.wat[1]==res[1]&&b.wat[2]==res[2

])48

//printf("%d %d %d %d\n",b.wat[0],b.wat[1],b.wat[2],b.step);

49if(!vis[b.wat[0]][b.wat[1

]])dl.push(b);

50 vis[b.wat[0]][b.wat[1]]=1;51

}52}53

}54 puts("-1"

);55}56

intmain()

64return0;

65 }

nyoj 三個水杯 BFS

解題思路 有三種容量的杯子 v1,v2,v3 記錄每乙個杯子裡水的體積為 s1,s2,s3 每乙個杯子的剩餘容量為水杯裡的水在相互傾倒的時候會有以下的兩種情況 1 乙個杯子a所剩的容量 大小為va sa 比水杯b要倒過來的水 大小為sb 大的時候可以將b裡的水全部倒到a中,最終a中水的體積為sa s...

nyoj三個水杯 bfs

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

NYOJ 21 三個水杯 BFS

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