nyoj 21三个水杯(BFS + 栈)

题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21

 

思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在加上栈的操作就能找到最后的路径(就是总共需要倒几次水);

操作:

  首先:将水杯初始化(A 0 0)进栈 当前倒水0次

  然后进行搜索,取出栈顶,判断是否是目标结果,不是则把这个状态进行转移(就是进行这个状态进行在一次倒水操作,)

  直到找到目标状态或是不能得到目标状态为止

 

这题感觉就是那个到倒水的时候处理不好处理 我是直接一步一步倒的

例如 A B C 三个水杯

首先进行A向 BC倒

再进行B 向 AC倒

最后是 C 向 AB倒

代码:

#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio>

using namespace std;

typedef struct numb
{
    int ta,tb,tc;
    int t;
    numb()
    {
        ta = 0,tb = 0,tc = 0,t = 0;
    }
}numb;

int x,y,z;//初始状态
int x1,y1,z1;//目标状态
int tmp[101][101][101];//标记是否已经倒过

vector<numb>v;//使用vector 来模拟栈操作
vector<numb>::iterator p;

void judge(numb ans,int t)//判断是否能入栈
{
    if(tmp[ans.ta][ans.tb][ans.tc] == 0)
    {
        // cout<<"stack = "<<ans.ta<<" "<<ans.tb<<" "<<ans.tc<<endl;
        tmp[ans.ta][ans.tb][ans.tc] = 1;
        ans.t = t;
        v.push_back(ans);
    }
}
void water(int xx,int yy,int zz,int t)//倒水处理
{
    numb ans;
    int kk = 0;
    if(xx > 0)//从x想yz倒水
    {
        if(yy < y)//到在y中
        {
            kk = y-yy;
            if(kk >= xx)
            {
                ans.ta = 0; ans.tb = yy + xx; ans.tc = zz;
                judge(ans,t);
            }
            else
            {
                ans.ta = xx - kk; ans.tb = yy + kk; ans.tc = zz;
                judge(ans,t);
            }
        }

        if(zz < z)//到在z中
        {
            kk = z - zz;
            if(kk >= xx)
            {
                ans.ta = 0; ans.tb = yy; ans.tc = zz + xx;
                judge(ans,t);
            }
            else
            {
                ans.ta = xx - kk; ans.tb = yy; ans.tc = zz + kk;
                judge(ans,t);
            }
        }
    }

    if(yy > 0)
    {
        if(xx < x)
        {
            kk = x - xx;
            if(kk >= yy)
            {
                ans.ta = xx + yy; ans.tb = 0; ans.tc = zz;
                judge(ans,t);
            }
            else
            {
                ans.ta = xx + kk; ans.tb = yy - kk; ans.tc = zz;
                judge(ans,t);
            }
        }

        if(zz < z)
        {
            kk = z - zz;
            if(kk >= yy)
            {
                ans.ta = xx; ans.tb = 0; ans.tc = zz + yy;
                judge(ans,t);
            }
            else
            {
                ans.ta = xx; ans.tb = yy - kk; ans.tc = zz + kk;
                judge(ans,t);
            }
        }
    }

    if(zz  > 0)
    {
        if(xx < x)
        {
            kk = x - xx;
            if(kk >= zz)
            {
                ans.ta = xx + zz; ans.tb = yy; ans.tc = 0;
                judge(ans,t);
            }
            else
            {
                ans.ta = xx + kk; ans.tb = yy; ans.tc = zz - kk;
                judge(ans,t);
            }
        }

        if(yy < y)
        {
            kk = y - yy;
            if(kk >= zz)
            {
                ans.ta = xx; ans.tb = yy+zz; ans.tc = 0;
                judge(ans,t);
            }
            else
            {
                ans.ta = xx; ans.tb = yy+kk; ans.tc = zz - kk;
                judge(ans,t);
            }
        }
    }
}
int BFS()//搜索
{
    numb ans;
    while(v.empty() != true)
    {
        ans = v[0];
        p = v.begin();
        v.erase(p);
        //cout<<"ans = "<<ans.ta<<" "<<ans.tb<<" "<<ans.tc<<" "<<ans.t<<endl;
        if(ans.ta == x1 && ans.tb == y1 && ans.tc == z1)
            return ans.t;
        else
        water(ans.ta,ans.tb,ans.tc,++ans.t);
    }
    return -1;
}
int main()
{
   int T;
    cin>>T;
   while(T--)
   {
      memset(tmp,0,sizeof(tmp));
      cin>>x>>y>>z;
      cin>>x1>>y1>>z1;
      tmp[x][0][0] = 1;
      numb ans;
      ans.ta = x; ans.tb = 0; ans.tc = 0; ans.t = 0;
      v.push_back(ans);
      //water(100,0,0,0);
      cout<<BFS()<<endl;
      v.clear();
   }
   return 0;
}

  

---恢复内容结束---

posted @ 2013-08-29 18:21  heity  阅读(224)  评论(0编辑  收藏  举报