java咖啡杯_三个水杯——java,广度优先搜索

importjava.util.Arrays;importjava.util.LinkedList;importjava.util.Queue;importjava.util.Scanner;classState

{int glass[] = new int[3];intstep;

}public classMain

{static final int MAX = 3;static int v[] = new int[MAX];static int e[] = new int[MAX];static boolean vis[][][] = new boolean[300][300][300];static intflag;public static voidmain(String []args)

{

Scanner cin= newScanner(System.in);int N =cin.nextInt();for(int i = 0; i < N; i++)

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

{

v[j]=cin.nextInt();

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

{

e[j]=cin.nextInt();

}

flag= 0;

Init();

BFS();if(flag == 0)

{

System.out.println("-1");

}

}

}static voidInit()

{for(int i = 0; i < v[0]; i++)

{for(int j = 0; j < v[0]; j++)

{for(int k = 0; k < v[0]; k++)

{

vis[i][j][k]= false;

}

}

}

}static voidBFS()

{

State start= newState();

start.glass[0] = v[0];

start.glass[1] = 0;

start.glass[2] = 0;if(start.glass[0] == e[0] && start.glass[1] == e[1] && start.glass[2] == e[2])

{

flag= 1;

System.out.println("0");return;

}

Queue que = new LinkedList();

que.add(start);

vis[start.glass[0]][start.glass[1]][start.glass[2]] = true;while(!que.isEmpty())

{

State temp= newState();

temp=que.poll();for(int i = 0; i < 3; i++)//核心代码

{if(temp.glass[i] == 0)

{continue;

}//i向j中倒水

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

{if(j == i || temp.glass[j] == v[j]) //同一个杯子或者这个杯子已经满了

{continue;

}//向其他某个杯子倒

State mid = newState();//此处的对象用得很巧妙(不可以定义在这个循环的外面),我之前都是建立一个很大很大的数组用来保存队列,太浪费空间了。

mid.glass[0] = temp.glass[0];

mid.glass[1] = temp.glass[1];

mid.glass[2] = temp.glass[2];

mid.step= temp.step+1;int rest = v[j]-temp.glass[j];if(rest <=mid.glass[i])

{

mid.glass[j]=v[j];

mid.glass[i]= mid.glass[i]-rest;if(vis[mid.glass[0]][mid.glass[1]][mid.glass[2]] == false)

{if(mid.glass[0] == e[0] && mid.glass[1] == e[1] && mid.glass[2] == e[2])

{

flag= 1;

System.out.println(mid.step);return;

}

que.add(mid);

vis[mid.glass[0]][mid.glass[1]][mid.glass[2]] = true;

}

}else{

mid.glass[j]= mid.glass[j] +mid.glass[i];

mid.glass[i]= 0;if(vis[mid.glass[0]][mid.glass[1]][mid.glass[2]] == false)

{if(mid.glass[0] == e[0] && mid.glass[1] == e[1] && mid.glass[2] == e[2])

{

flag= 1;

System.out.println(mid.step);return;

}

que.add(mid);

vis[mid.glass[0]][mid.glass[1]][mid.glass[2]] = true;

}

}

}

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值