题目10
题解10
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class State{
int glass[] = new int[3];
int step;
}
public class Main10{
static int v[] = new int[3];
static int e[] = new int[3];
static boolean vis[][][] = new boolean[300][300][300];
static int flag;
public static void main(String []args){
Scanner cin = new Scanner(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 void Init(){
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 void BFS(){
State start = new State();
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 <State> que = new LinkedList<State>();
que.add(start);
vis[start.glass[0]][start.glass[1]][start.glass[2]] = true;
while(!que.isEmpty()) {
State temp = new State();
temp = que.poll();
for(int i = 0; i < 3; i++){//核心代码
if(temp.glass[i] == 0)
continue;
for(int j = 0; j < 3; j++){
if(j == i || temp.glass[j] == v[j])
continue;
State mid = new State();
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;
}
}
}
}
}
}
}