NYOJ 21 三個水杯

2021-09-08 09:08:19 字數 2902 閱讀 8698

時間限制:

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這題和前兩天寫的 poj 中jugs那道題思路一樣,用 佇列 加上 搜尋 搞定

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;78

intva, vb, vc, ta, tb, tc;

9bool visit[205][205][205

];10

struct

state11;

1718 inline bool

check(state t)

1924

25int bfs(int sa, int sb, int

sc)26

46else

4752

if(!visit[t2.a][t2.b][t2.c])

5360}61

if(t1.c != vc && t1.a) //

pour va to vc

6269

else

7075

if(!visit[t2.a][t2.b][t2.c])

7683}84

if(t1.a != va && t1.b) //

pour vb to va

8592

else

9398

if(!visit[t2.a][t2.b][t2.c])

99106

}107

if(t1.a != va && t1.b) //

pour vb to vc

108115

else

116121

if(!visit[t2.a][t2.b][t2.c])

122129

}130

if(t1.a != va && t1.c) //

pour vc to va

131138

else

139144

if(!visit[t2.a][t2.b][t2.c])

145152

}153

if(t1.b != vb && t1.c) //

pour vc to vb

154161

else

162167

if(!visit[t2.a][t2.b][t2.c])

168175

}176

}177

return -1

;178

}179

180int

main()

181194 visit[va][0][0] = true

;195 printf("

%d\n

", bfs(va, 0, 0

));196

}197

//system("pause");

198return0;

199 }

這是本題oj上的最優**:---好短

1

2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8#define clr(arr,val) memset(arr,val,sizeof(arr))

9 bitset<1000000>hash;

10const

int max_step=100000;11

int wq[max_step][4],goal[3],cap[3

],goalval;

12int head=0,tail=0;13

void movw(int numfrom,int numto,int

other)

1423

else

2428

int hashval=wq[tail][0]*10000+wq[tail][1]*100+wq[tail][2

];29

if(hashval==goalval) throw wq[head][3]+1;30

if(wq[head][numfrom]!=0 && !hash[hashval])

3135}36

intmain()

3746 wq[tail][0]=cap[0];wq[tail][1]=0;wq[tail][2]=0;wq[tail][3]=0

;47 ++tail;

48try

54 puts("-1"

);55 }catch(int

step)

5659

}60 }

NYOJ21 三個水杯

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

NYOJ21 三個水杯

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

nyoj21三個水杯。。

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