HDU 1495 非常可乐

http://acm.hdu.edu.cn/showproblem.php?pid=1495

bfs,个人感觉很经典的题目,分六种情况搜索

View Code
#include <iostream>
using namespace std ;
int s,n,m ;
int q[101*101*101][3] ;
int dp[101][101][101] ;
int bfs()
{
    if(s&1)
        return 0 ;
    if(n<(s>>1))
        return 0 ;
    dp[s][0][0]=0 ;
    int front=0,rear=1 ;
    q[front][0]=s ,q[front][1]=0 ,q[front][2]=0 ;
    while(front<rear)
    {
        int x,y,z ;
        int xx,yy,zz ;
        int pour ;
        x=q[front][0] ,y=q[front][1] ,z=q[front][2] ;
        front++ ;
        //s->n
        if(x!=0 && y!=n)
        {
            pour=min(x,n-y) ;
            xx=x-pour ;
            yy=y+pour ;
            zz=z ;
            if(dp[xx][yy][zz]==-1)
            {
                dp[xx][yy][zz]=dp[x][y][z]+1 ;
                q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ;
                rear++ ;
            }
        }
        //s->m
        if(x!=0 && z!=m)
        {
            pour=min(x,m-z) ;
            xx=x-pour ;
            yy=y ;
            zz=z+pour ;
            if(dp[xx][yy][zz]==-1)
            {
                dp[xx][yy][zz]=dp[x][y][z]+1 ;
                q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ;
                rear++ ;
            }
        }
        //n->s
        if(y!=0 && x!=s)
        {
            pour=min(y,s-x) ;
            xx=x+pour ;
            yy=y-pour ;
            zz=z ;
            if(dp[xx][yy][zz]==-1)
            {
                dp[xx][yy][zz]=dp[x][y][z]+1 ;
                q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ;
                rear++ ;
            }
        }
        //n->m
        if(y!=0 && z!=m)
        {
            pour=min(y,m-z) ;
            xx=x ;
            yy=y-pour ;
            zz=z+pour ;
            if(dp[xx][yy][zz]==-1)
            {
                dp[xx][yy][zz]=dp[x][y][z]+1 ;
                q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ;
                rear++ ;
            }
        }
        //m->s
        if(z!=0 && x!=s)
        {
            pour=min(z,s-x) ;
            xx=x+pour ;
            yy=y ;
            zz=z-pour ;
            if(dp[xx][yy][zz]==-1)
            {
                dp[xx][yy][zz]=dp[x][y][z]+1 ;
                q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ;
                rear++ ;
            }
        }
        //m->n
        if(z!=0 && y!=n)
        {
            pour=min(z,n-y) ;
            xx=x ;
            yy=y+pour ;
            zz=z-pour ;
            if(dp[xx][yy][zz]==-1)
            {
                dp[xx][yy][zz]=dp[x][y][z]+1 ;
                q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ;
                rear++ ;
            }
        }
    }
    return dp[s>>1][s>>1][0] ;
}
int main()
{
    while(scanf("%d%d%d",&s,&n,&m),(s||n||m))
    {
        if(n<m)
            n^=m^=n^=m ;
        memset(dp,-1,sizeof(dp)) ;
        int ans=bfs() ;
        if(ans<=0)
            puts("NO") ;
        else 
            printf("%d\n",ans) ;
    }
    return 0 ;
}
原文地址:https://www.cnblogs.com/xiaohongmao/p/2537887.html