HDU 1495 非常可乐(BFS + 模拟)

女爷i 2024-02-17 19:06 154阅读 0赞

思路:bfs求解,对每一个状态的S,N,M,有六种方式倒水(S->N,S->M;N->S,N->M;M->S,M->N),当三个杯子当中任意两个杯子装水等于S/2时,即为解。

在进行六种方式循环时,需要从倒水的杯子(剩水量a[i])和将倒入水的杯子中(还可以装多少水cup[j]-a[j])选择最小的一个min1,然后a[i]-=min1;a[j]+=min1;满足条件时加入队列。S为奇数时一定不能平均分配

  1. #include<cstdio>
  2. #include<queue>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=100+5;
  7. int d[maxn][maxn];
  8. int S,N,M;
  9. struct node{
  10. int s,n,m;
  11. node(int s=0,int n=0,int m=0):s(s),n(n),m(m){}
  12. } ;
  13. void bfs(){
  14. int cup[]={S,N,M};
  15. memset(d,0,sizeof(d));
  16. queue<node>q;
  17. q.push(node(S,0,0));
  18. while(!q.empty()){
  19. node u=q.front();
  20. q.pop();
  21. if((u.s==S/2 && u.n==S/2) || (u.s==S/2&&u.m==S/2) || (u.n==S/2&&u.m==S/2)){
  22. printf("%d\n",d[u.n][u.m]);
  23. return ;
  24. }
  25. int a[3];
  26. for(int i=0;i<3;i++)
  27. for(int j=0;j<3;j++){
  28. a[0]=u.s;a[1]=u.n;a[2]=u.m;
  29. if(i!=j){
  30. //选择一个最小的从将要倒水的杯子(里面还有水a[i])和 将要倒入水的杯子(还可以装cup[i]-a[j])
  31. int min1=min(a[i],cup[j]-a[j]);
  32. a[i]-=min1;
  33. a[j]+=min1;
  34. node v=node(a[0],a[1],a[2]);
  35. if(!d[v.n][v.m])
  36. { q.push(v);
  37. d[v.n][v.m]=d[u.n][u.m]+1;
  38. }
  39. }
  40. }
  41. }
  42. printf("NO\n");
  43. }
  44. int main(){
  45. while(scanf("%d%d%d",&S,&N,&M)==3 && S && N && M){
  46. if(S%2==0)
  47. bfs();
  48. else printf("NO\n");
  49. }
  50. return 0;
  51. }

发表评论

表情:
评论列表 (有 0 条评论,154人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU 1728(BFS)

    问题描述: 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些