HDU 非常可樂 (BFS)

2021-09-12 07:05:34 字數 3745 閱讀 4000

1495 非常可樂

大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n 毫公升和m 毫公升 可樂的體積為s (s<101)毫公升 (正好裝滿一瓶) ,它們三個之間可以相互倒可樂 (都是沒有刻度的,且 s==n+m,101>s>0,n>0,m>0) 。聰明的acmer你們說他們能平分嗎?如果能請輸出倒可樂的最少的次數,如果不能輸出"no"。

input

三個整數 : s 可樂的體積 , n 和 m是兩個杯子的容量,以"0 0 0"結束。

output

如果能平分的話請輸出最少要倒的次數,否則輸出"no"。

sample input

7 4 3

4 1 3

0 0 0

sample outputno3

本題使用bfs的順序進行模擬,每一次倒可樂如出現新的盛放順序就放進佇列並在地圖上表明已經出現過了,很類似走迷宮問題,和迷宮最大的區別就是迷宮的走法規律簡單,但倒可樂的方式有五種,需要大量**進行模擬。

#include

#include

using namespace std;

struct node

;struct node node[

101]

[101][

101]

;int

main()

}}int v0, v1, v2;

while

(scanf

("%d%d%d"

,&v0,

&v1,

&v2)

, v0)

;int result =0;

queue q;

node[v0][0

][0]

.len =0;

iswalked[v0][0

][0]

=1; q.

push

(node[v0][0

][0]

);while

(q.size()

&&!result)

; nextv[0]

= q.

front()

.v[0

]+ q.

front()

.v[1

]- v1;

nextv[1]

= v1;

nextv[2]

= q.

front()

.v[2];

if(iswalked[nextv[0]

][nextv[1]

][nextv[2]

]==0)

if(nextv[0]

== v0 /2&&

(nextv[1]

== v0 /

2|| nextv[2]

== v0 /2)

)result = q.

front()

.len +1;

nextv[0]

= q.

front()

.v[0

]+ q.

front()

.v[2

]- v2;

nextv[1]

= q.

front()

.v[1];

nextv[2]

= v2;

if(iswalked[nextv[0]

][nextv[1]

][nextv[2]

]==0)

if(nextv[0]

== v0 /2&&

(nextv[1]

== v0 /

2|| nextv[2]

== v0 /2)

)result = q.

front()

.len +1;

nextv[0]

= q.

front()

.v[0

]+ q.

front()

.v[1];

nextv[1]

=0; nextv[2]

= q.

front()

.v[2];

if(iswalked[nextv[0]

][nextv[1]

][nextv[2]

]==0)

if(nextv[0]

== v0 /2&&

(nextv[1]

== v0 /

2|| nextv[2]

== v0 /2)

)result = q.

front()

.len +1;

nextv[0]

= q.

front()

.v[0

]+ q.

front()

.v[2];

nextv[1]

= q.

front()

.v[1];

nextv[2]

=0;if

(iswalked[nextv[0]

][nextv[1]

][nextv[2]

]==0)

if(nextv[0]

== v0 /2&&

(nextv[1]

== v0 /

2|| nextv[2]

== v0 /2)

)result = q.

front()

.len +1;

nextv[0]

= q.

front()

.v[0];

if(q.

front()

.v[1

]>= v2 - q.

front()

.v[2])

else

if(iswalked[nextv[0]

][nextv[1]

][nextv[2]

]==0)

if(nextv[0]

== v0 /2&&

(nextv[1]

== v0 /

2|| nextv[2]

== v0 /2)

)result = q.

front()

.len +1;

nextv[0]

= q.

front()

.v[0];

if(q.

front()

.v[2

]>= v1 - q.

front()

.v[1])

else

if(iswalked[nextv[0]

][nextv[1]

][nextv[2]

]==0)

if(nextv[0]

== v0 /2&&

(nextv[1]

== v0 /

2|| nextv[2]

== v0 /2)

)result = q.

front()

.len +1;

q.pop();

}if(result)

printf

("%d\n"

, result)

;else

printf

("no\n");

}}return0;

}

非常可樂 bfs

大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n 毫公升和m 毫公升 可樂的體積為s s 101 毫公升...

非常可樂 BFS

大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n 毫公升和m 毫公升 可樂的體積為s s 101 毫公升...

非常可樂(bfs

problem 非常可樂 description 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n 毫公...