USACO 1.4 Mother's Milk (枚举 + DFS)

#include <stdio.h>
#define DEBUG 1
#define TESTCASES 9
#define MAX_CAPACITY 20

int capacity[4];
int visited[MAX_CAPACITY + 1][MAX_CAPACITY + 1];
int count;

void pour(int state[4]){
	int from, to;
	for (from = 1; from <= 3; from++)
		for (to = 1; to <= 3; to++){
			if (from == to)
				continue;
			int milk[4];
			int bucket;
			for (bucket = 1; bucket <= 3; bucket++)
				milk[bucket] = state[bucket];
			int temp = state[to] + state[from];
			if (temp > capacity[to]){
				milk[from] = temp - capacity[to];
				milk[to] = capacity[to];
			} else {
				milk[from] = 0;
				milk[to] = temp;
			}
			if (visited[ milk[1] ][ milk[3] ] == 1)
				continue;
			else {
				count++;
				visited[ milk[1] ][ milk[3] ] = 1;
				pour(milk);
			}
		}//end of for (to = 1; to <= 3; to++)
}

int main(){
#if DEBUG
	int testCase;
	for (testCase = 1; testCase <= TESTCASES; testCase++){
		char inputFileName[20] = "inputx.txt";
		inputFileName[5] = '1' +  (testCase - 1);
		freopen(inputFileName, "r", stdin);
		printf("\n#%d\n", testCase);
#endif

	int bucket;
	for (bucket = 1; bucket <= 3; bucket++)
		scanf("%d", &capacity[bucket]);

	int capacityA = capacity[1];
	int capacityC = capacity[3];
	int milkA, milkC;
	for (milkA = 0; milkA <= capacityA; milkA++)
		for (milkC = 0; milkC <= capacityC; milkC++)
			visited[milkA][milkC] = 0;

	int initialState[4] = {0, 0, 0, capacity[3]};
	//可根据count判断最后应该输出空格还是回车
	count = 0;
	pour(initialState);
	
	for (milkC = 0; milkC <= capacityC; milkC++)
		for (milkA = 0; milkA <= capacityA; milkA++){
			if (visited[milkA][milkC] == 1 && milkA == 0){
				count--;
				printf("%d%c", milkC, count == 0 ? '\n' : ' ');
				break;
			}
		}
		
#if DEBUG
	}
#endif
	return 0;
}


 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值