1017 非常可樂
題意:有體積為s的一瓶可樂,和體積為m,n的兩個杯子,他們都沒有刻度,求將可樂平分最少倒多少次。
思路:三個杯子倒可樂,共有六種情況,s->n,s->m,m->s,m->n,n->s,n->m,判斷每種可能的情況,新增到佇列中,逐一搜尋。
感想:直接對所有可能的情況搜尋,思路並不複雜。
#include
#include
#include
#include
#include
using namespace std;
#define maxn 101
bool visit[maxn][maxn];
int m,n,s,si,sj;
struct node
int x,y,all,t; //x,y,all分別表示m,n,s杯中可樂的體積,t表示倒了多少次
void bfs()
queueque;
memset(visit,false,sizeof(visit));
node p,q;
p.x = 0,p.y = 0,p.t = 0,p.all = s;
que.push(p);
visit[p.x][p.y] = true;
while(!que.empty())
p = que.front();
que.pop();
if(p.y == p.all && p.y == s/2)
printf("%d\n",p.t);
return;
if(p.all+p.x>m) //s倒m
q.x = m,q.y= p.y,q.all =p.all+p.x-m,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] =true;
else
q.x = p.all+p.x,q.y = p.y,q.all = 0,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] =true;
if(p.all+p.y>n) //s倒n
q.x= p.x, q.y = n, q.all = p.all+p.y-n,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] =true;
else
q.x = p.x,q.y = p.all+p.y,q.all = 0,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] =true;
if(p.x+p.y>n) //m倒n
q.x = p.x+p.y-n,q.y = n,q.all = p.all,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] =true;
else
q.x = 0,q.y = p.x+p.y,q.all = p.all,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] =true;
if(p.x+p.all>s) //m倒s
q.all =s,q.x = p.x+p.all-s,q.y = p.y,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] = true;
else
q.all =p.all+p.x,q.x = 0,q.y = p.y,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] = true;
if(p.x+p.y > m) //n倒m
q.y=p.y+p.x-m,q.x=m,q.all=p.all,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] =true;
else
q.x = p.x+p.y,q.y = 0,q.all = p.all,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] =true;
if(p.all+p.y>s) //n倒s
q.all = s,q.x = p.x,q.y = p.all+p.y-s,q.t = p.t+1;
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] = true;
else
q.all = p.all+p.y,q.x = p.x,q.y = 0,q.t = p.t+1; //n倒s
if(!visit[q.x][q.y])
que.push(q),visit[q.x][q.y] = true;
printf("no\n");
int main()
while(scanf("%d%d%d",&s,&m,&n) &&(s||m||n))
if(s%2)
printf("no\n");
continue;
if(m > n) swap(m,n);
bfs();
return 0;
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 非常可樂
題目 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n 毫公升和m 毫公升 可樂的體積為s s 101 ...