ACM集训的Day3 B。。。盲目搜索之DFS。。。

milk

一.题目描述:

gzp有三个容量分别是A,B,C升的桶,A,B,C分别是三个从120的整数, 最初,AB桶都是空的,而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 }

 

posted @ 2016-07-01 23:47  meetviolet  Views(294)  Comments(0Edit  收藏  举报