三个水杯
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
-
输入
-
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
- 每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1 样例输入
-
2 6 3 1 4 1 1 9 3 2 7 1 1
样例输出
-
3 -1
-
第一行一个整数N(0<N<50)表示N组测试数据
以前写的,广搜问题,判重的方法是3个水杯的水量,倒一次水相当于走一步
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct NODE
{
int num[3];
int step;
struct NODE * next;
}Node;
bool haxi[100][100][100];
int main()
{
int i , j , k , l , num[3] , n[3];
Node *head , *tail , *new_node;
scanf("%d" , &i);
while(i--)
{
memset(haxi , 0 , sizeof(haxi));
scanf("%d %d %d" , &num[0] , &num[1] , &num[2]);
scanf("%d %d %d" , &n[0] , &n[1] , &n[2]);
if(n[0] > num[0] || n[1] > num[1] || n[2] > num[2] || n[0] + n[1] + n[2] != num[0] )
{
printf("-1\n");
continue;
}
if(num[0] == n[0])
{
printf("0\n");
continue;
}
new_node = (Node *) calloc(1 , sizeof(Node));
new_node->num[0] = num[0];
new_node->num[1] = 0;
new_node->num[2] = 0;
haxi[new_node->num[0]][new_node->num[1]][new_node->num[2]] = 1;
tail = head = new_node;
for( ; head != NULL ; head = head->next)
{
for(j = 0 ; j < 3 ; j ++)
{
if(head->num[j] == 0)
continue;
for(k = 0 ; k < 3 ; k++)
{
if(head->num[k] >= num[k])
continue;
if(j == k)
continue;
new_node = (Node *)calloc(1 , sizeof(Node));
for(l = 0 ; l < 4 ; l++)
new_node->num[l] = head->num[l];
if(head->num[j] > num[k] - head->num[k])
{
new_node->num[j] -= num[k] - head->num[k];
new_node->num[k] = num[k];
}
else
{
new_node->num[k] += new_node->num[j];
new_node->num[j] = 0;
}
if(haxi[new_node->num[0]][new_node->num[1]][new_node->num[2]] == 1)
{
free(new_node);
continue;
}
if(new_node->num[0] == n[0] && new_node->num[1] == n[1] && new_node->num[2] == n[2])
{
printf("%d\n" , head->step + 1);
k = 3 ;
j = 3;
for( tail = head , head = head->next ; head != NULL ; head = head->next )
{
free(tail);
tail = head;
}
continue;
}
new_node->step = head->step + 1;
tail->next = new_node;
tail = new_node;
haxi[new_node->num[0]][new_node->num[1]][new_node->num[2]] = 1;
}
}
}
printf("-1\n");
}
return 0;
}