三个水杯

#include<iostream>
#include<algorithm>
#include<ctype.h>
#include<string>
#include<string.h>
#include<fstream>
#include<vector>
#include<queue> 
#include"iomanip"
using namespace std;
int vis[101][101][101];    //用来记录已经达到的状态 
struct Node
{
    int now_Water[3];
    int max_Water[3];
    int step;
}node,temp;
queue<Node> q;
int bfs()
{
    int e[3];
    cin>>node.max_Water[0]>>node.max_Water[1]>>node.max_Water[2];
    cin>>e[0]>>e[1]>>e[2];
    node.step = 0;
    node.now_Water[0] = node.max_Water[0];
    node.now_Water[1] = 0;
    node.now_Water[2] = 0;
    q.push(node);
    //vis[node.now_Water[0]][node.now_Water[1]][node.now_Water[2]] = 1;
    
    if(node.now_Water[0] == e[0] && node.now_Water[1] == e[1] && node.now_Water[2] == e[2] )
        return 0;
    while(!q.empty())
    {
        node = q.front();
        q.pop();
        // 1->2   1->3  2->3 2->1 3->1 3->2
        vis[node.now_Water[0]][node.now_Water[1]][node.now_Water[2]] = 1;
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                if(i!=j)
                {
                    temp = node;
                    if(node.now_Water[i]!=0)
                    {
                        
                        if(node.now_Water[j] + node.now_Water[i] <= node.max_Water[j])
                        {
                            temp.now_Water[j] = node.now_Water[j] + node.now_Water[i];
                            temp.now_Water[i] = 0;
                            temp.step = node.step + 1;
                            if(temp.now_Water[0] == e[0] && temp.now_Water[1] == e[1] && temp.now_Water[2] == e[2] )
                                return temp.step;
                            if(vis[temp.now_Water[0]][temp.now_Water[1]][temp.now_Water[2]] == 0)
                                q.push(temp);
                        }
                        else
                        {
                            temp.now_Water[i] = node.now_Water[i] - (node.max_Water[j]-node.now_Water[j]);
                            temp.now_Water[j] = node.max_Water[j];
                            temp.step = node.step + 1;
                            if(temp.now_Water[0] == e[0] && temp.now_Water[1] == e[1] && temp.now_Water[2] == e[2] )
                                return temp.step;
                            if(vis[temp.now_Water[0]][temp.now_Water[1]][temp.now_Water[2]] == 0)
                                q.push(temp);
                        }
                        
                    }
                }
            }
        }
    }
    return -1;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        while(!q.empty())
        {
            q.pop();
        }
        for(int i=0;i<101;i++)
            for(int j=0;j<101;j++)
                for(int k=0;k<101;k++)
                    vis[i][j][k]=0;
        int ans = bfs();
        cout<<ans<<endl;
    }
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/fzuhyj/p/9693170.html