导航

NYOJ 21-三个水杯

Posted on 2013-07-23 15:58  勇敢的炮灰  阅读(140)  评论(0)    收藏  举报

点击打开链接

三个水杯

时间限制: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


以前写的,广搜问题,判重的方法是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;
}