時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:4
描述
給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。
輸入
第一行乙個整數n(0v2>v3 v1<100 v3>0)表示三個水杯的體積。
第二行給出三個整數e1 e2 e3 (體積小於等於相應水杯體積)表示我們需要的最終狀態
輸出每行輸出相應測試資料最少的倒水次數。如果達不到目標狀態輸出-1
樣例輸入
26 3 1
4 1 1
9 3 2
7 1 1
樣例輸出
3-1這題和前兩天寫的 poj 中jugs那道題思路一樣,用 佇列 加上 搜尋 搞定
1 #include 2 #include 3 #include 4 #include 56using
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上的最優**:---好短
12 #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 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入第一行乙個整數...