• cdoj470倒水问题


    http://acm.uestc.edu.cn/#/status/list?problemId=470

    ///*470 倒水问题*/
    #include<iostream>
    #include<queue>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int a[3];///*3个杯子*/
    int n;///*需要凑的n*/
    int vis[1001][1001];///*访问数组*/
    struct Node
    {
            int bz[3], step;
    };
    queue<Node> q;
    int bfs()
    {
            while(!q.empty())
                    q.pop();
            q.push(Node{a[0],0,0,0});
            while(!q.empty())
            {
                    Node s = q.front();
                    Node ss;///*Node() {}  这个不写   这一句报错  妈的~~~...*/
                    q.pop();///*s出队*/
                    if(s.bz[0] == n || s.bz[1] == n || s.bz[2] == n)///*判断其中一个是否到达n*/
                            return s.step;
                    for(int i = 0; i < 3; i++)///*循环杯子[i]向杯子[j]中倒水*/
                            for(int j = 0; j < 3; j++)
                            {
                                    if(i == j)
                                            continue;///*自己不能给自己倒水~;*/
                                    int cha = a[j] - s.bz[j];///*杯子[j]此时还能放下多少水~*/
                                    ss = s;///**这个可以直接用s  不过还是为了以防万一  另写一个结构体对象吧/
                                    if(ss.bz[i] && cha)
                                    {
                                            if(ss.bz[i] > cha)///*表示能beizi[i]能向被子j里倒水 且能剩余*/
                                            {
                                                    ss.bz[j] = a[j];///*倒满了*/
                                                    ss.bz[i] -= cha;///*杯子[i] 减去到的水*/
                                            }
                                            else///*剩不下  直接全部给杯子[j]*/
                                            {
                                                    ss.bz[j] += ss.bz[i];///*全部给被子[j]*/
                                                    ss.bz[i] = 0;
                                            }
                                            if(!vis[ss.bz[0]][ss.bz[1]])///*未访问   1 2 未访问   vis[a[0]][a[1]][a[2]就不可能被访问了]   如果只看0的话  会少东西`  就相当于 5 4 3凑   5 0  0   变成  0 4 1  .. 0 3 2  不准确*/
                                            {
                                                    vis[ss.bz[0]][ss.bz[1]] = 1;///*置1*/
                                                    q.push(Node{ss.bz[0], ss.bz[1], ss.bz[2], ss.step+1});///*入队步数加1*/
                                            }
                                    }
                            }
            }
            return -1;
    }
    int main ()
    {
            while(cin>>a[0]>>a[1]>>a[2])
            {
                    cin>>n;
                   // sort(a, a+3, compare);///*调用上面的compare函数*/
                    memset(vis, 0, sizeof(vis));///*初始化0*/
                    int ans = bfs();
                    if(ans == -1)///*-1的时候表示凑不到数 所以输出NO*/
                            cout<<"NO"<<endl;
                    else
                            cout<<ans<<endl;
            }
            return 0;
    }
    

      

  • 相关阅读:
    Container With Most Water 容器最大水容量
    socket阻塞IO流程图
    python模块time,random,os
    python生成器表达式yield,面向过程编程,部分内置函数
    python装饰器作业
    Python函数闭包装饰器
    Python函数参数,名称空间与作用域
    Linux基础3
    Linux基础2
    linux基础1
  • 原文地址:https://www.cnblogs.com/zhangshuyao/p/8634399.html
Copyright © 2020-2023  润新知