非常可樂 bfs

2021-07-30 18:00:24 字數 1497 閱讀 2683

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

4 1 3

0 0 0

no

3

這題之前有做過,根據題目意思我們發現,他需要的是倒出兩杯一樣多可樂,假如給的可樂一開始就是奇數那麼永遠不可能倒出一樣多的可樂,所以在開始我們就可以判斷一下瓶中的可樂是否是奇數,如果是奇數就返回。然後我們來討論一下這題的狀態轉移,我們發現從乙個狀態轉移到另乙個狀態會出現一下幾種情況。

1->2,1->3,2->1,2->3,3->1,3->2這六種倒水方式,我們可以用乙個陣列就可以儲存起來,而乙個杯子向另乙個杯子倒水需要滿足一下幾個條件:

1.水進入的杯子有剩餘空間

2.水出去的杯子裡面有水

就可以倒水了,而判重我則只需要宣告乙個二維陣列就足夠了,因為s= m+ n,只要記錄了m和n則可以確定s。剩下的就是bfs了。

#include 

#include

#include

#include

using

namespace

std;

int state[8][3] = ,,,,,};

int pw;

bool vis[1000][1000];

struct cup

}start;

queue

q;cup pour(cup p,int i)

bool check(cup p)

int bfs(cup init)}}

return -1;

}void init()

int main()

pw = start.water[1]/2;

init();

cup init;

init.water[1] = start.water[1];

init.water[2] = 0;

init.water[3] = 0;

int ans = bfs(init);

if(ans != -1)printf("%d\n",ans);

else

printf("no\n");

}}

非常可樂 BFS

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

非常可樂(bfs

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

非常可樂(bfs)

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