这一题经过反复的深思熟虑,使用三元数组作为牛奶桶中的牛奶,可以解决很多不必要的纠纷!这个题目充分体现了数据结构对算法影响力的巨大!如果不使用数组而使用三个变量作为参数传递的话,真的会很麻烦的,虽然程序大致的时间复杂度不会改变,但是其常数项会大大增加!所以这题的数据结构选择十分重要。
我的思路就是暴力枚举所有牛奶可能的情况,反复搜索,用used[a][c]防止重复搜索。
这一题没有一个Mistack,代码具体如下:
LANG: C
ID: yylogoo2
PROG: milk3
/
#include <stdio.h>
#include <string.h>
int limit[3];
int used[21][21];
#define move_to(a, b) do{\
memcpy(tmp, num, sizeof(tmp));\
if(sub_move_to(tmp, a, b)){\
srch(tmp);\
}\
}while(0)
int sub_move_to(int num[3], int from, int to)
{
int t;
if(num[from] == 0 || num[to] == limit[to]){
return 0;
}
t = num[from];
if(t + num[to] > limit[to]){
t = limit[to] – num[to];
}
num[from] -= t;
num[to] += t;
return 1;
}
void srch(int num[3])
{
int tmp[3];
if(used[num[0]][num[2]]){
return;
}
used[num[0]][num[2]] = 1;
move_to(0, 1);
move_to(1, 0);
move_to(2, 1);
move_to(1, 2);
move_to(2, 0);
move_to(0, 2);
}
int main(void)
{
int i, k = 0;
freopen("milk3.in", "r", stdin);
freopen("milk3.out", "w", stdout);
for(i = 0; i < 3; i++){
scanf("%d", &limit[i]);
}
srch((int [3]){0, 0, limit[2]});
for(i = 0; i <= 20; i++){
if(used[0][i]){
if(k){
printf(" ");
}
k = 1;
printf("%d", i);
}
}
printf("\n");
return 0;
}