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 }
时间: 2024-12-22 07:16:56

ACM集训的Day3 B。。。盲目搜索之DFS。。。的相关文章

yzm10的ACM集训小感

7月30号,ACM集训进行了两周,一切都已on the right way.这时的我适时地从题海中探出头,其实除了刷题,也该写点什么来总结下过去.首先,在第一周里,我学习了数据结构,知道了STL这么一个神奇的存在.不管是stack.queue亦或multiset,还有最具代表的priority_queue(习惯性地打上下划线..)有时候堆的logn真的能帮你优化不少时间.只需一个头文件,你就可以调用他们(美滋滋~).还有k学长讲的并查集也非常实用,区间合并用到cys学长share的next跳(类

2015年暑期ACM集训总结

今年暑假学校照例进行了ACM的暑假集训,跟以往不同的是:今年我作为一个老队员站上了讲台,体验了一把当老师的感觉,给新队员讲解ACM系列知识. 在集训开始之前,我跟一个同学写了一个ACM的评测系统,啊,评测系统?高达上啊.其实不然,这个系统也没有想象的那么复杂,只能简单地评测程序的几种状态: Compile Error Runtime Error Time Limit Exceeded Wrong Answer Accepted 所写的评测系统,是一个线下的评测系统,即只能本地上交程序,然后评测,

七月23 ACM集训——最小生成树

prim算法模板 int  prim(int x){    int i,j,sum=0,min=M,k; memset(vit,0,sizeof(vit));    memset(dis,0,sizeof(dis));    for(i=1;i<=m;i++)        dis[i]=p[x][i];    dis[x]=0;    vit[x]=1;     for(i=1;i<m;i++)    {        min=M;        k=-1;        for(j=1;j

[ACM] poj 1088 滑雪 (记忆化搜索DFS)

求n*m网格内矩形的数目[ACM] poj 1088 滑雪 (记忆化搜索DFS),布布扣,bubuko.com

acm集训训练赛A题【签到题】

一.题目 Description After winning gold and silver in IOI 2014, Akshat and Malvika want to have some fun. Now they are playing a game on a grid made of nhorizontal and m vertical sticks. An intersection point is any point on the grid which is formed by t

acm集训训练赛(二)D题【并查集】

一.题目 Description There is a town with N citizens. It is known that some pairs of people are friends. According to the famous saying that ?The friends of my friends are my friends, too? it follows that if A and B are friends and B and C are friends th

acm集训训练赛B题【排序+模拟】

一.原题 Description Being a programmer, you like arrays a lot. For your birthday, your friends have given you an array a consisting of ndistinct integers. Unfortunately, the size of a is too small. You want a bigger array! Your friends agree to give you

七月25 ACM集训——kmp算法

字符串比配问题,通过引入next[]而使效率提高 关于next[]数组,是对模式串的特征来构造的: 为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀. 在匹配过程称,若发生不匹配的情况,如果next[j]>=0,则目标串的指针i不变,将模式串的指针j移动到next[j]的位置继续进行匹配:若next[j]=-1,则将i右移1位,并将j置0,继续进行比较. 具体思想: 根据定义next[0]=-1,

ACM学习历程—HDU1716 排列2(dfs &amp;&amp; set容器)

Description Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数. Input 每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束. Output 对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在同一行,同一行中每个四位数间用空格分隔. 每组输出数据间空一行,最后一组数据后面没有空行. Sample Input 1 2 3 4 1 1 2 3 0 1