您的位置:首页 > 其它

HDU 1495 非常可乐 (BFS)

2014-06-05 19:42 393 查看

问题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495

题目大意:一个瓶子容积s,两个杯子容积分别n,m,并且都没有刻度(不能比对噢!)。相互倒水,求平分的他们的最少倒水次数。

思路:暴力搜索吧。并且求最少,(即最优解),所以上BFS;

思考:状态,转移过程,怎么剪纸。







惨痛的debug,我不解释了。

源代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define maxn 110
using namespace std;

int s,n,m;
int vis[maxn][maxn][maxn];
int sum=0;
struct node{
int s;
int n;
int m;
int cnt;
//node(){}
node(int x,int y,int z,int c)
{
s=x;n=y;m=z;cnt=c;
}
};

int BFS(node sta,int time)
{
//int cnt=0;
//cout<<"time-->"<<time<<endl;
queue<node> que;
que.push(sta);
while(que.front().cnt<=time&&!que.empty())
{

node cur=que.front();
//cout<<cur.s<<"---->"<<cur.n<<"--->"<<cur.m<<endl;

que.pop();
if((cur.s==cur.n&&!cur.m)||(cur.s==cur.m&&!cur.n)||(cur.m==cur.n&&!cur.s))
{
//cout<<"fuck-->1"<<endl;
return cur.cnt;
}
if(vis[cur.s][cur.n][cur.m])
continue;

vis[cur.s][cur.n][cur.m]=1;

if(cur.s)//-------->s
{
if(cur.n<n)
{
if(cur.s>n-cur.n)
que.push(node(cur.s-(n-cur.n),n,cur.m,cur.cnt+1));

else
que.push(node(0,cur.n+cur.s,cur.m,cur.cnt+1));
}
if(cur.m<m)
{
if(cur.s>m-cur.m)
que.push(node(cur.s-(m-cur.m),cur.n,m,cur.cnt+1));

else
que.push(node(0,cur.n,cur.m+cur.s,cur.cnt+1));
}
}

if(cur.n)//--------->n
{
if(cur.s<s)
{
if(cur.n>s-cur.s)
que.push(node(s,cur.n-(s-cur.s),cur.m,cur.cnt+1));
else
que.push(node(cur.s+cur.n,0,cur.m,cur.cnt+1));
}
if(cur.m<m)
{
if(cur.n>m-cur.m)
que.push(node(cur.s,cur.n-(m-cur.m),m,cur.cnt+1));

else
que.push(node(cur.s,0,cur.m+cur.n,cur.cnt+1));
}

}

if(cur.m)
{
if(cur.s<s)
{
if(cur.m>s-cur.s)
que.push(node(s,cur.n,cur.m-(s-cur.s),cur.cnt+1));
else
que.push(node(cur.s+cur.m,cur.n,0,cur.cnt+1));
}
if(cur.n<n)
{
if(cur.m>n-cur.n)
que.push(node(cur.s,n,cur.m-(n-cur.n),cur.cnt+1));

else
que.push(node(cur.s,cur.n+cur.m,0,cur.cnt+1));
}
}
}

//cout<<"fuck-->2"<<endl;

return -1;
}

int main()
{
while(scanf("%d%d%d",&s,&n,&m),s||n||m)
{
memset(vis,0,sizeof vis);
node sta(s,0,0,0);
//cout<<"sta.cnt-->"<<sta.cnt<<endl;
//vis[s][0][0]=1;
int res=BFS(sta,s*n*m);
if(res==-1)
printf("NO\n");
else
printf("%d\n",res);
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: