UVA 非常可樂

2021-08-17 17:39:10 字數 1099 閱讀 5248

#include #include #include #include #include using namespace std;

struct node

;int vis[205][205];//注意vis陣列用於

int s, n, m;

int cup_left[3] = ;//記錄三個杯子中每個杯子的剩餘狀態

int bfs()

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

//三種杯子的狀態均要記錄

next.x[i] = now.x[i] - left;

next.x[j] = now.x[j] + left;

if (!vis[next.x[1]][next.x[2]])//以中間兩個杯子的狀態進行判斷是否進行過訪問

}} }

return -1;

}int main()

cup_left[0] = s;//記錄最大杯子

cup_left[1] = max(n, m);//記錄中間杯子的容量,注意固定相應的表示方法

cup_left[2] = min(n, m);//最小杯子

int result = bfs();

if (result == -1)

else

}getchar();

getchar();

return 0;

}

1、第二次做這道題,感覺理解有加深了一點,關鍵要注意理解三個杯子進行倒水時對於狀態的理解,最後的平分狀態只能是最大的杯子與中等的杯子平分,並且我們還可以在輸入時進行剪枝判斷,如果輸入的可樂的容量為奇數,直接可以判斷不能平分

2、其他則是bfs的模組化處理,利用佇列,其中關鍵在於6種倒水狀態的控制,三個杯子有六種不同的倒水狀態,則利用i控制倒水的杯子,j控制接受水的杯子

3、重點!!!兩個杯子倒水時,只能是兩種情況,第一種情況時倒水的杯子將水倒滿了,而接受水的杯子還沒有滿,第二種情況是倒水的杯子倒不完,但接受水的杯子已經滿了,此處需要乙個狀態判斷,實際倒的水應該是兩種情況的最小值,其餘的直接利用bfs搜尋就可以了

4、此題有一處細節,分大,中,小三種杯子,並且固定三種杯子的表示方式

1017 非常可樂

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

1017 非常可樂

題意 要求將一瓶可樂平均分成份,問能否平均分成兩份,如果能輸出最少需要幾次否則輸出no題目給出三個整數 s n m s表示可樂總量 n m分別為兩個杯子的容量 且 s n m 思路 先將m,n按大小排序 小的設為m 由 s 0 0 狀態 轉換到 0 s 2 s 2 的狀態且要找出最優解,用bfs 題...

1017 非常可樂

1017 非常可樂 題意 有體積為s的一瓶可樂,和體積為m,n的兩個杯子,他們都沒有刻度,求將可樂平分最少倒多少次。思路 三個杯子倒可樂,共有六種情況,s n,s m,m s,m n,n s,n m,判斷每種可能的情況,新增到佇列中,逐一搜尋。感想 直接對所有可能的情況搜尋,思路並不複雜。inclu...