大家一定覺的運動以後喝可樂是一件很愜意的事情,但是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 34 1 3
0 0 0
sample output
no3
抽象的搜尋問題,
每次操作都有6個方向 (將三個杯子分別編號為0 ,1,2對應的full的容量為s,n,m)
1. 0->1(0號杯子往1號杯子裡面倒)
2. 2->1
3. 0->2
4. 1->2
5 1->0
6 2->0
將每次操作後杯子飲料的容量作為地圖map存放前兩個杯子飲料的容量 。(三個杯子飲料總和一定,前兩個確定,第三個也杯子內飲料的容量也就確定了,所以用兩個杯子就可以了)
這樣根據杯子倒水次數來廣搜,杯子的飲料的容量作為路徑去搜尋
1.方向陣列vis[6][3] 存每次操作對應的編號
2.full陣列存下對應編號杯子的最大容量
3.tiji陣列表示此次倒水之後對應編號的飲料的容量
4.map陣列以前兩個編號杯子的容量為下標,0表示出現過,1表示未出現過;
5.用個turn()函式來表示倒飲料的操作
map[i][j]=1,表示該狀態已經存在,下次再出現i ,j的情況時就不用去搜尋這種情況(未找到答案也是這因這種情況而停止的)
ps值得一提的是,沒有答案時說明倒水操作一直在乙個重複過的迴圈當中,//題外話,不要將這個看作解題的一部分(●'◡'●)
#include開三位陣列會超時,但這道題開個二維陣列就ok了,因為總量一定 前兩個的體積知道 第三個也就確定了
#include#include#include#include#include#define n 110
#includeusing namespace std;
int map[n][n],flag,s,n,m,ans,vis[6][3]=,,,,,},full[3],tiji[3];
double zhi;
struct node;
queuemmp;
void turn(int *aa,int *bb,int full)//a->b
else
*aa=a;
*bb=b;
return ;
}void dfs()
mmp.pop();
for(int i=0;i<6;i++)
}}void bfs()
}int main()
}
M 非常可樂
三個杯子,s,a,b分別代表它們的容量,s a b,先給s這個杯子倒滿水,a,b不倒水,要求是利用三個杯子平分s裡邊的水,問如果可以求倒水的次數 三個杯子可以互相倒水 還是用bfs來做,三個杯子有6種倒法,難點就在於,如何倒水,以及最後判斷是否平分,看了乙個大神的做法,他是用陣列的下標0,1,2來表...
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 題...