hdu1495非常可乐bfs

http://acm.hdu.edu.cn/showproblem.php?pid=1495
Problem Description
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出”NO”。

Input
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以”0 0 0”结束。

Output
如果能平分的话请输出最少要倒的次数,否则输出”NO”。

Sample Input
7 4 3
4 1 3
0 0 0

Sample Output
NO
3

分为6种情况搜索,小->大,小->总,大->总,总->大,总->小,大->小;记录最小步数

#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;

struct node
{
   int all,small,big,num;
};
int all,big,small;
bool visit[101][101];
int bfs()
{int count;
 memset(visit,0,sizeof(visit));
 queue<node>q;
 node s,g;
 s.all=all;s.small=0;s.big=0;s.num=0;
 visit[s.big][s.small]=1;
 q.push(s);
 while(!q.empty())
 {
  s=q.front();
  q.pop();
  count=0;
  if(s.all==all/2) count++;
  if(s.big==all/2) count++;
  if(s.small==all/2) count++;
  if(count==2)
  return s.num;
  if(s.all)
  {
    g=s;
    if(g.big<big)//all->big
    {
        if(g.big+g.all>big)
        {
            g.all-=(big-g.big);
            g.big=big;
        }
        else
        {
            g.big+=g.all;
            g.all=0;
        }
        g.num++;
        if(!visit[g.big][g.small])
        {
            visit[g.big][g.small]=1;
            q.push(g);
        }
    }
    g=s;
    if(g.small<small)//all->small
    {
       if(g.small+g.all>small)
       {
            g.all-=(small-g.small);
            g.small=small;
       }
       else
       {
            g.small+=g.all;
            g.all=0;
       }
       g.num++;
       if(!visit[g.big][g.small])
       {
            visit[g.big][g.small]=1;
            q.push(g);
       }
     }
   }
   /////////////////////
   if(s.big)
   {
     g=s;
     if(g.small<small)//big->small
     {
        if(g.small+g.big>small)
        {
            g.big-=(small-g.small);
            g.small=small;
        }
        else
        {
            g.small+=g.big;
            g.big=0;
        }
        g.num++;
        if(!visit[g.big][g.small])
        {
           visit[g.big][g.small]=1;
           q.push(g);
        }
      }
      g=s;//small->big
      g.all+=g.big;
      g.big=0;
      g.num++;
    if(!visit[g.big][g.small])
    {
       visit[g.big][g.small]=1;
       q.push(g);
    }
   }
///////////////////
  if(s.small)
  {
    g=s;
    if(g.big<big)//small->big
    {
      if(g.big+g.small>big)
      {
         g.small-=(big-g.big);
         g.big=big;
      }
      else
      {
         g.big+=g.small;
         g.small=0;
      }
      g.num++;
      if(!visit[g.big][g.small])
      {
        visit[g.big][g.small]=1;
        q.push(g);
      }
     }
    g=s;
    g.all+=g.small;//small->all
    g.small=0;
    g.num++;
    if(!visit[g.big][g.small])
    {
      visit[g.big][g.small]=1;
      q.push(g);
    }
   }
}
return 0;
}
int main()
{
  int ans,temp;
  while(scanf("%d%d%d",&all,&small,&big)!=EOF&&big+small+all!=0)
  {
     if(small>big)
     {
        temp=small;
        small=big;
        big=temp;
     }
     if(all%2==1)
     ans=0;
     else
     ans=bfs();
     if(ans)
     printf("%d\n",ans);
     else
     printf("NO\n");
   }
   return 0;

}

你可能感兴趣的:(hdu1495非常可乐bfs)