• codevs1226倒水问题(Bfs)


    /*
    首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 
    最少步数 想到Bfs 
    维护队列里的状态:要有个步数  还要有v :此时刻三个杯子有多少水
    然后倒水:因为没有刻度 所以有两种情况:要么出水的为空 要么接水的满了
    然后每次取队首时判断有没有某一个杯子装的水恰好为答案 
    注意判重时可以弄一个f [a][b] 表示第一个杯子有a升水 第二个杯子有b升水的状态存在了没 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    int x,y,z,f[101][101],c[4];
    struct node
    {
        int v[4];//此状态每个杯子的水有多少 
        int step;//步数 
    };
    queue<node>q;
    int main()
    {
        cin>>x>>y>>z;
        c[1]=x;c[2]=y;c[3]=201;//记号最大容量 
        node be;
        be.step=0;
        be.v[1]=0;be.v[2]=0;
        be.v[3]=201;
        q.push(be);//出状态 前两个杯子空 第三个大杯子满 
        while(!q.empty())
          {
              node tmp=q.front();
              q.pop();
              if(tmp.v[1]==z||tmp.v[2]==z)//判断符合条件了没有 
                {
                    cout<<tmp.step;
                    return 0;
              }
              int i,j;
              for(i=1;i<=3;i++)// 枚举出水的杯子和接水的 
                for(j=1;j<=3;j++)
                  if(!tmp.v[i]||tmp.v[j]==c[j])continue;//如果出水的空了 或者接水的满了 跳过 
                  else 
                    {
                        int minn=min(tmp.v[i]+tmp.v[j],c[j])-tmp.v[j];//计算到多少水 
                        node x=tmp;
                        x.v[i]-=minn;//倒水 
                        x.v[j]+=minn;//节水 
                        x.step=tmp.step+1;
                        if(f[x.v[1]][x.v[2]]==0)//判断此状态存在了没 
                          {
                              f[x.v[1]][x.v[2]]=1;
                              q.push(x);
                      }
                  }
          }
        cout<<"impossible";
        return 0;
    }
  • 相关阅读:
    Flexigrid 完成表格数据显示
    地图高度自适应
    Vmware汉化版下载
    EasyUI grid 封装JSON数据
    C# 中的委托和事件
    C#中的委托和事件(续)
    从dataReader到Entity转化时利用Reflect示例
    sql 压缩数据库出错
    输入日期可以计算星期几
    用CSS调整scrollbar(滚动条)的配色
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5424109.html
Copyright © 2020-2023  润新知