• 非常可乐


    题意就是给你仨瓶子,一个是可乐瓶,两个空瓶,三个都能用,你要倒来倒去来用两个瓶子平分第一个瓶里的可乐,但是倒的时候只能把瓶子倒满。输出平分需要的最少步骤,若不能输出NO;

    广搜把每一步的结果都记录下来,自己可以找点小数据在纸上试试就明白了,代码有点长思路很清晰。注意一下标记就可以了,没有太大坑点,主要在理解。

    #include <stdio.h>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <string.h>
    #include <stack>
    #define LL long long
    #define mem(a) memset(a,0,sizeof(a))
    int M,N,S,vis[105][105][105];
    struct node
    {
        int s,n,m,step;
    };
    std::queue<node> q;
    int bfs()
    {
        node a,t;
        int i,k;
        mem(vis);
        while(q.size())
            q.pop();
        a.s=S;
        a.m=0;
        a.n=0;
        a.step=0;
        q.push(a);
        vis[a.s][0][0]=1;
        while(q.size())
        {
            a=q.front();
            q.pop();
            if(a.s==S/2&&a.m==S/2||a.s==S/2&&a.n==S/2||a.m==S/2&&a.n==S/2)
                return a.step;
            for(i=0;i<6;i++)//倒可乐的循环步骤,光看是不容易理解的,自己找数据亲自试试,想想
            {
                if(i==0)///S-->M
                {
                    k=a.s<(M-a.m)?a.s:(M-a.m);
                    t.s=a.s-(M-a.m);
                    t.m=a.m+k;
                    t.n=a.n;
                }
                else if(i==1)///M-->S
                {
                    k=a.m<(S-a.s)?a.m:(S-a.s);
                    t.s=a.s+k;
                    t.m=a.m-k;
                    t.n=a.n;
                }
                else if(i==2)///S-->N
                {
                    k=a.s<(N-a.n)?a.s:(N-a.n);
                    t.s=a.s-k;
                    t.n=a.n+k;
                    t.m=a.m;
                }
                else if(i==3)///N-->S
                {
                    k=a.n<(S-a.s)?a.n:(S-a.s);
                    t.s=a.s+k;
                    t.n=a.n-k;
                    t.m=a.m;
                }
                else if(i==4)///M-->N
                {
                    k=a.m<(N-a.n)?a.m:(N-a.n);
                    t.s=a.s;
                    t.m=a.m-k;
                    t.n=a.n+k;
                }
                else///N-->M
                {
                    k=a.n<(M-a.m)?a.n:(M-a.m);
                    t.s=a.s;
                    t.m=a.m+k;
                    t.n=a.n-k;
                }
                if(!vis[t.s][t.m][t.n])
                {
                    t.step=a.step+1;
                    vis[t.s][t.m][t.n]=1;
                    q.push(t);
                }
            }
        }
        return -1;
    }
    int main()
    {
        while(scanf("%d%d%d",&S,&N,&M),M+S+N)
        {
            if(S%2>0)
                printf("NO
    ");
            else
            {
                int k=bfs();
                if(k!=-1)
                    printf("%d
    ",k);
                else
                    printf("NO
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    【原创】大数据基础之调度框架
    使用mysql索引的规则
    mysql分区(partition)
    mysql-主从复制(二)
    yum 一些命令
    centos 升级php、mysql(webtatic)
    Linux 查找文件方法
    mysql-备份和还原(普通还原和binlog还原)
    mysql-主从复制(一)
    GSAP JS基础教程--动画的控制及事件
  • 原文地址:https://www.cnblogs.com/nr1999/p/8485693.html
Copyright © 2020-2023  润新知