题目大意:
给你一杯体积为S的满的牛奶,然后有两个容量之和为S的杯子,求倒最小的次数将这杯牛奶平分。
解题思路:
直接用bfs暴力模拟吧,广搜好写,这道题目比较适合广搜,深搜搞了好久还是没有搞出来,等下把它弄出来。
代码:
#include
#include
using namespace std;
const MAX=105;
struct pp
{
int x;
int y;
int z;
int step;
};
int visited[MAX][MAX][MAX];
pp pre,cur;
int a,b,c;
int bfs()
{
queue Q;
visited[c][0][0]=1;
pre.x=c;
pre.y=0;
pre.z=0;
pre.step=0;
Q.push(pre);
int half=c/2;
// cout<=a)
{
cur.x=cur.x+cur.y-a;
cur.y=a;
if(!visited[cur.x][cur.y][cur.z])
{
Q.push(cur);
visited[cur.x][cur.y][cur.z]=1;
}
}
else
{
cur.y=cur.x+cur.y;
cur.x=0;
if(!visited[cur.x][cur.y][cur.z])
{
Q.push(cur);visited[cur.x][cur.y][cur.z]=1;
}
}
}
if(pre.z=b)
{
cur.x=cur.x+cur.z-b;
cur.z=b;
if(!visited[cur.x][cur.y][cur.z])
{
Q.push(cur);visited[cur.x][cur.y][cur.z]=1;
}
}
else
{
cur.z=cur.x+cur.z;
cur.x=0;
if(!visited[cur.x][cur.y][cur.z])
{
Q.push(cur);visited[cur.x][cur.y][cur.z]=1;
}
}
}
}
if(pre.y)//对a瓶
{
cur=pre;//把a倒入c
cur.x=cur.x+cur.y;
cur.y=0;
if(!visited[cur.x][cur.y][cur.z])
{
Q.push(cur);visited[cur.x][cur.y][cur.z]=1;
}
if(pre.z=b)//把a倒入b
{
cur.y=cur.y+cur.z-b;
cur.z=b;
if(!visited[cur.x][cur.y][cur.z])
{
Q.push(cur);visited[cur.x][cur.y][cur.z]=1;
}
}
else
{
cur.z=cur.y+cur.z;
cur.y=0;
if(!visited[cur.x][cur.y][cur.z])
{
Q.push(cur);visited[cur.x][cur.y][cur.z]=1;
}
}
}
}
if(pre.z)//对b瓶
{
//把b倒回c
cur=pre;
cur.x=cur.x+cur.z;
cur.z=0;
if(!visited[cur.x][cur.y][cur.z])
{
Q.push(cur);visited[cur.x][cur.y][cur.z]=1;
}
if(pre.y=a)//把b倒入a
{
cur.z=cur.y+cur.z-a;
cur.y=a;
if(!visited[cur.x][cur.y][cur.z])
{
Q.push(cur);visited[cur.x][cur.y][cur.z]=1;
}
}
else
{
cur.y=cur.y+cur.z;
cur.z=0;
if(!visited[cur.x][cur.y][cur.z])
{
Q.push(cur);visited[cur.x][cur.y][cur.z]=1;
}
}
}
}
}
return 0;
}
void init()
{
for(int i=0;i>c>>a>>b,a||b||c)
{
int ans;
init();
if(c%2)
{
cout<<"NO"<