标签:
#include <iostream>
#include <string.h>
#include<queue>
using namespace std;
//标记步骤,如果标记了,说明行不通
bool vis[102][102][102];
  struct node{
      //三个杯子的状态
      int a,b,c;
      //倒水的步骤
      int s;
};
bool bfs(int a,int b,int c,int &n){
      node t,s;//通过两个变量不断调换
      queue<node> q;
      memset(vis,false,sizeof(vis));
      t.a = a;
      t.b = 0;
      t.c = 0;
      t.s = 0;
      q.push(t);
      while(!q.empty()){
            t = q.front();
            q.pop();
            vis[t.a][t.b][t.c] = true;
            //通过三个杯子的状态,判断是否符合我们想要的状态
            if((t.a*2==a&&t.b*2==a) || (t.a*2==a&&t.c*2==a) || (t.b*2==a&&t.c*2==a)){
                  n = t.s;
                return true;
            }
            //处理第一个瓶子
            if(t.a > 0){
                    //a杯子倒进b杯子
                  if(t.a > (b - t.b)){
                        s.a = t.a-(b-t.b);//填满第二个杯子
                        s.b = b;//更改第二个杯子的状态
                        s.c = t.c;
                        s.s = t.s + 1;
                  }
                  else{
                        s.a = 0;
                        s.b = t.b + t.a;
                        s.c = t.c;
                        s.s = t.s + 1;
                  }
                  //设置标记
                  if(!vis[s.a][s.b][s.c]){
                         vis[s.a][s.b][s.c] = true;
                         q.push(s);
                  }
                   //a杯子倒进c杯子
                  if(t.a > (c-t.c)){
                        s.a=t.a-(c-t.c);
                        s.c=c;
                        s.b=t.b;
                        s.s=t.s+1;
                  }
                  else{
                        s.a=0;
                        s.c=t.a+t.c;
                        s.b=t.b;
                        s.s=t.s+1;
                  }
                  if(!vis[s.a][s.b][s.c]){
                         vis[s.a][s.b][s.c] = true;
                         q.push(s);
                  }
            }
            //处理b杯子
            if(t.b > 0){
                     //b杯子倒进a杯子
                  if(t.b > a - t.a){
                        s.b = t.b - (a-t.a);
                        s.a = a;
                        s.c = t.c;
                        s.s = t.s+1;
                  }
                  else{
                        s.b = 0;
                        s.a = t.a + t.b;
                        s.c = t.c;
                        s.s = t.s + 1;
                  }
                  if(!vis[s.a][s.b][s.c]){
                         vis[s.a][s.b][s.c] = true;
                         q.push(s);
                  }
              // //b杯子倒进c杯子
              if(t.b > c - t.c){
                        s.b = t.b - (c-t.c);
                        s.a = t.a;
                        s.c = c;
                        s.s = t.s+1;
                  }
                  else{
                        s.b = 0;
                        s.a = t.a;
                        s.c = t.c + t.b;
                        s.s = t.s + 1;
                  }
                  if(!vis[s.a][s.b][s.c]){
                         vis[s.a][s.b][s.c] = true;
                         q.push(s);
                  }
            }
            //处理c杯子
            if(t.c > 0){
                     //c杯子倒进a杯子
                  if(t.c > a - t.a){
                        s.c = t.c - (a-t.a);
                        s.a = a;
                        s.b = t.b;
                        s.s = t.s+1;
                  }
                  else{
                        s.c = 0;
                        s.a = t.a + t.c;
                        s.b = t.b;
                        s.s = t.s + 1;
                  }
                  if(!vis[s.a][s.b][s.c]){
                         vis[s.a][s.b][s.c] = true;
                         q.push(s);
                  }
              // //c杯子倒进b杯子
              if(t.c > b - t.b){
                        s.c = t.c - (b-t.b);
                        s.a = t.a;
                        s.b = b;
                        s.s = t.s+1;
                  }
                  else{
                        s.c = 0;
                        s.a = t.a;
                        s.b = t.c + t.b;
                        s.s = t.s + 1;
                  }
                  if(!vis[s.a][s.b][s.c]){
                         vis[s.a][s.b][s.c] = true;
                         q.push(s);
                  }
            }
      }
      return false;
}
int main()
{
      int a,b,c,n;//abc三个杯子
      while(cin >> a >> b>> c && (a + b +c)){
            if(a & 1){
                  cout << "NO" << endl;
            }
            else if(bfs(a,b,c,n)){
                  cout << n << endl;
            }
            else{
                  cout << "NO" << endl;
            }
      }
      return 0;
}
标签:
原文地址:http://www.cnblogs.com/2016zhanggang/p/5425111.html