ACM集训的Day3 B。。。盲目搜索之DFS。。。
milk
一.题目描述:
gzp有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到 另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约, 牛奶不会有丢失
写一个程序去帮助gzp找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
二.格式:
INPUT FORMAT:
单独的一行包括三个整数A,B和C。
OUTPUT FORMAT:
只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性
三.样例:
输入:8 9 10
输出:1 2 8 9 10
输入 2 5 10
输出 5 6 7 8 9 10
时间限制:10000 ms
空间限制:128 M
分析:
用DFS(深度优先搜索)
因为牛奶的总量是不变的,所以可以用a,b中的牛奶量做状态,初始状态是(0,0),每次只能有6种选择,a倒b,a倒c,b倒a,b倒c,c倒a,c倒b。
ps:代码里面有注释。。。我依旧懒懒的 -*>0<* ╮(╯▽╰)╭
&最近睡眠时间严重不足T T
代码:
1 #include <iostream> 2 #include<cstring> 3 using namespace std; 4 int a,b,c,tf[21][21]; 5 void dfs(int i, int k) { //dfs深度优先搜索 6 if (tf[i][k])return; //判重作用 7 tf[i][k] = 1; //标记搜索 8 dfs(0,k); //如果C的剩余容量大于等于A的牛奶量,则把A倒空,A为0,B为k A->C 9 dfs(i,0); //如果C的剩余容量大于等于B的牛奶量,则把B倒空,A为i,B为0 B->C 10 if (i>=b-k)dfs(i-b+k,b); //A的牛奶量大于等于B的剩余容量,将 B填满,则 A牛奶量为i-(b-k) A->B 11 else dfs(0,i+k); //A的牛奶量小于B剩余容量,把A倒空,则B中有i+k斤牛奶 A->B 12 if (k>=a-i)dfs(a,k-a+i); //如果B的牛奶量大于等于A的剩余容量,那么把A填满,A中有a斤,B中有k-(a-i) B->A 13 else dfs(i+k,0); //如果B中的牛奶量小于A的剩余容量,把B倒空,A中有i+k斤牛奶 B->A 14 int j=c-i-k; //令j为C的牛奶量 15 if (j>=a-i)dfs(a,k); //如果C的牛奶量大于等于A的剩余容量,把A填满,则A中有a斤,C中有j-(a-i),B中有k C->A 16 else dfs(i+j,k); //如果C的牛奶量小于A的剩余容量,把C倒空,则 A为i+j,C为0,B为k C->A 17 if (j>=b-k)dfs(i,b); //如果C的牛奶量大于等于B的剩余容量,把B填满,则A为i,B为b,C为j-(b-k) C->B 18 else dfs(i,k+j); //如果C的牛奶量小于B剩余容量,把C倒空,则A为i,B为k+j,C为0 C->B 19 } 20 int main() { 21 scanf("%d%d%d",&a,&b,&c); 22 memset(tf,0,sizeof(tf)); //初始化tf数组,所有情况为false 23 dfs(0, 0); //不向A,B倾倒牛奶的情况 24 for (int i=b,bol=0;i>=0;i--) //B的牛奶量上限为b 25 if (tf[0][i]){ //如果这种[0][i]情况可以存在,则tf[0][i]==1(true) 26 if(bol)cout<<' '; //定义的类似bool值标记作用的bol变量,控制当是第一个数据的时候不输出空格 27 else bol=1; //不是第一个数据的时候会输出空格 28 cout<<c-i; //输出C的可能的牛奶量。 29 } 30 cout << endl; 31 }