南阳理工ACM 题目21 三个水杯 java代码 广度优先

import java.util.LinkedList;

import java.util.Queue;

import java.util.Scanner;

public class Main {

 static class Node

 {

  int water[]=new int[3];//水杯水

  int step;//步骤

 }

 static class M

 {

  boolean visted[][][];//标记水杯的状态

  int start[];//输入状态

  int end[];//输出状态

  void init()//初始化

  {

   Scanner aa=new Scanner(System.in);

   int N=aa.nextInt();

   while(N–!=0)

   {

    start=new int[3];

    end=new int[3];

    visted=new boolean[100][100][100];

    for(int i=0;i<3;i++)

    {

     start[i]=aa.nextInt();

    }

    for(int i=0;i<3;i++)

    {

     end[i]=aa.nextInt();

    }

    int k=BFS();

    System.out.println(k);

   }

   

  }

  int achieve(Node node)         //判断是否到达结束状态

  {

   for(int i = 0; i < 3; i++)

   {

    if(node.water[i] != end[i])

     return 0;

   }

   return 1;

  }   int BFS()//广度优先

  {

   Queue<Node> queue=new LinkedList<Node>();//生成队列

   Node s1=new Node();

   s1.water[0]=start[0];

   s1.water[1]=0;

   s1.water[2]=0;

   s1.step=0;

   queue.offer(s1);

   visted[start[0]][0][0]=true;

   while(!queue.isEmpty())

   {

    Node node=queue.element();//获得第一个元素

    queue.poll();//删除第一个元素

    

    if(achieve(node)==1)//判断是否符合条件

    {

     return node.step;

    }

    for(int i=0;i<3;i++)//将水从第i个杯子倒到第j个杯子

    {

     for(int j=0;j<3;j++)

     {

      if(i==j)

       continue;

      if(node.water[i]!=0&&node.water[j]<start[j])//倒水的杯子必须有谁=水,并且接水的杯子的水量不能超过上限

      {

       Node node2=new Node();

       node2.step=node.step;

       node2.water[0]=node.water[0];

       node2.water[1]=node.water[1];

       node2.water[2]=node.water[2];

       int pour=start[j]-node2.water[j];//要倒的水量

       if(node2.water[i]>=pour)//不会倒空

       {

        

        node2.water[j]+=pour;

        node2.water[i]-=pour;

       }

       else//倒空

       {

        node2.water[j]+=node2.water[i];

        node2.water[i]=0;

        

       }

       node2.step=node.step+1;

       if(!visted[node2.water[0]][node2.water[1]][node2.water[2]])//如果这种情况没有出现

       {

        visted[node2.water[0]][node2.water[1]][node2.water[2]]=true;

        queue.add(node2);//入队

       }

       

       

      }

     }

    }

   }

   return -1;

  }

 }

 public static void main(String str[])

 {

  M m=new M();

  m.init();

 }

}

点赞