zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    【SCOI 2011】 糖果
    【POJ 3159】 Candies
    【POJ 1716】 Integer Intervals
    【POJ 2983】 Is the information reliable?
    【POJ 1364】 King
    【POJ 1201】 Intervals
    【POJ 1804】 Brainman
    6月10日省中提高组题解
    【POJ 3352】 Road Construction
    【POJ 1144】 Network
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5424109.html
Copyright © 2011-2022 走看看