NYOJ 21-三个水杯

来源:互联网 发布:adobe pdf mac 破解版 编辑:程序博客网 时间:2024/04/28 10:29

点击打开链接

三个水杯

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入
26 3 14 1 19 3 27 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;}