bfs非常可乐

题目:

https://vjudge.net/problem/HDU-1495

用v记录出现过的状态,bfs

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int v[102][102][102];
int s,n,m;
struct node
{
    int ts,tn,tm,level;
};
int bfs()
{ memset(v,0,sizeof(v));
queue<node> que;
    if(s%2==1)
        return -1;
    int aves=s/2;

    node w;
    w.ts=s;
    w.tn=0;
    w.tm=0;
    w.level=0;
    v[s][0][0]=1;
    que.push(w);
    while(!que.empty())
    {
        node q=que.front();
        que.pop();
        int ts=q.ts,tn=q.tn,tm=q.tm;
        if(ts==aves&&tn==aves||ts==aves&&tm==aves||tn==aves&&tm==aves)
        {
            return q.level;

        }

        node p;
        for(int i=0;i<6;i++)
        { ts=q.ts,tn=q.tn,tm=q.tm;
             //s->n
             if(i==0)
             {
                   if(ts&&ts>=n-tn)
                   {
                       ts-=n-tn;
                       tn=n;
                   }
                   else
                   {
                       tn+=ts;
                       ts=0;
                   }
                   if(!v[ts][tn][tm])
                   {
                       v[ts][tn][tm]=1;
                       p.ts=ts;
                       p.tn=tn;
                       p.tm=tm;
                       p.level=q.level+1;
                       que.push(p);
                   }
             }
             //s->m
              if(i==1)
             {
                   if(ts&&ts>=m-tm)
                   {
                       ts-=m-tm;
                       tm=m;
                   }
                   else
                   {
                       tm+=ts;
                       ts=0;
                   }
                   if(!v[ts][tn][tm])
                   {
                       v[ts][tn][tm]=1;
                       p.ts=ts;
                       p.tn=tn;
                       p.tm=tm;
                       p.level=q.level+1;
                       que.push(p);
                   }
             }
             //n->s
              if(i==2)
             {
                   if(tn&&tn>=s-ts)
                   {
                       tn-=s-ts;
                       ts=s;
                   }
                   else
                   {
                       ts+=tn;
                       tn=0;
                   }
                   if(!v[ts][tn][tm])
                   {
                       v[ts][tn][tm]=1;
                       p.ts=ts;
                       p.tn=tn;
                       p.tm=tm;
                       p.level=q.level+1;
                       que.push(p);
                   }
             }
             //n->m
              if(i==3)
             {
                   if(tn&&tn>=m-tm)
                   {
                       tn-=m-tm;
                       tm=m;
                   }
                   else
                   {
                       tm+=tn;
                       tn=0;
                   }
                   if(!v[ts][tn][tm])
                   {
                       v[ts][tn][tm]=1;
                       p.ts=ts;
                       p.tn=tn;
                       p.tm=tm;
                       p.level=q.level+1;
                       que.push(p);
                   }

             }
            //m->s
            if(i==4)
             {
                   if(tm&&tm>=s-ts)
                   {
                       tm-=s-ts;
                    ts=s;
                   }
                   else
                   {
                       ts+=tm;
                       tm=0;
                   }
                   if(!v[ts][tn][tm])
                   {
                       v[ts][tn][tm]=1;
                       p.ts=ts;
                       p.tn=tn;
                       p.tm=tm;
                       p.level=q.level+1;
                       que.push(p);
                   }
             }
             //m->n
             if(i==5)
             {
                   if(tm&&tm>=n-tn)
                   {
                       tm-=n-tn;
                    tn=n;
                   }
                   else
                   {
                       tn+=tm;
                       tm=0;
                   }
                   if(!v[ts][tn][tm])
                   {
                       v[ts][tn][tm]=1;
                       p.ts=ts;
                       p.tn=tn;
                       p.tm=tm;
                       p.level=q.level+1;
                       que.push(p);
                   }
             }


        }



    }
    return -1;
}
int main()
{
 while(1)
  {
      scanf("%d %d %d",&s,&n,&m);
      if(s==0&&n==0&&m==0)
        break;
      int ans=bfs();
      if(ans==-1)
        printf("NO\n");
      else
        printf("%d\n",ans);
  }
}

 

posted @ 2021-07-09 18:35  废柴废柴少女  阅读(50)  评论(0)    收藏  举报