首页 > 代码库 > HDU 1495 非常可乐 (BFS)
HDU 1495 非常可乐 (BFS)
问题链接: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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。