zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    安装go 环境
    reading notes —— effective Java;目录结构,便于复习与查找
    reading notes -- Amazon.com Recommendations: Item-to-Item Collaborative Filtering
    reading notes -- 知识图谱简介
    reading notes -- A Report from the Trenches
    原生 js 简单实现 Promise
    JS 中屏幕、浏览器和文档的高度、宽度和距离
    添加jQuery方法解析url查询部分
    表单验证常用正则表达式
    HTML5 + CSS3 实现地球绕太阳公转
  • 原文地址:https://www.cnblogs.com/yueyiviolet/p/5634572.html
Copyright © 2011-2022 走看看