1017 非常可樂

2021-07-11 09:24:52 字數 2784 閱讀 5883

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 ...