倒牛奶的问题, 开始看感觉跟倒水的问题很像, 想直接找规律, 写个类似于循环取余的代码。 但后来发现不行,因为这道题有三个桶,水量也是有限制的。只好用模拟的方法把所有的情况都试一遍。

建一个state[21][21][21]的数组存储出现过的状态。对于遍历状态,对每一种状态, 分别采用六种处理方法,若有新状态出现这将新状态置为1,同时标记flag++;若所有循环之后,flag == 0, 就说明遍历完成了。

开始脑子抽筋了, 写了个多出口的程序, 显然是错的。如下:

int mothersmilk(int a, int b, int c)
{
int aa, bb, cc;
int flag = ; aa = a, bb = b, cc = c;
pour(&aa, A, &bb, B);
if(state[aa][bb][cc] != )
{
state[aa][bb][cc] = ;
mothersmilk(aa, bb, cc); //
flag++;
} aa = a, bb = b, cc = c;
pour(&bb, B, &aa, A);
if(state[aa][bb][cc] != )
{
state[aa][bb][cc] = ;
mothersmilk(aa, bb, cc);
} aa = a, bb = b, cc = c;
pour(&aa, A, &cc, C);
if(state[aa][bb][cc] != )
{
state[aa][bb][cc] = ;
mothersmilk(aa, bb, cc); //
} aa = a, bb = b, cc = c;
pour(&cc, C, &aa, A);
if(state[aa][bb][cc] != )
{
state[aa][bb][cc] = ;
mothersmilk(aa, bb, cc);
} aa = a, bb = b, cc = c;
pour(&bb, B, &cc, C);
if(state[aa][bb][cc] != )
{
state[aa][bb][cc] = ;
mothersmilk(aa, bb, cc); //
} aa = a, bb = b, cc = c;
pour(&cc, C, &bb, B);
if(state[aa][bb][cc] != )
{
state[aa][bb][cc] = ;
mothersmilk(aa, bb, cc); //
}
  return 0;
//...
}

错误的原因在于,若是第一个if语句中的mothersmilk操作完了,一定会返回0,那后面的语句都起不到作用了。

后来发现,可以直接对所有的state变量循环,用for语句,逻辑就清楚多了,提交也AC了。正确的代码:

/*
ID: 13012131
LANG: C
TASK: milk3
*/ #include <stdio.h>
#include <assert.h> int state[][][]; //存储状态 出现过为1 未出现过为0
int A, B, C; int pour(int *a, int fulla, int *b, int fullb) //a向b倒水
{
if(*b == fullb || *a == ) //若a没水 或 b满 a不能向b倒水 状态不变
{
return ;
}
if(*b != fullb) //b不满
{
if(*a <= fullb - *b) //a倒光
{
*b = *b + *a;
*a = ;
}
else //b倒满
{
*a = *a - (fullb - *b);
*b = fullb;
}
}
return ;
} int main()
{
FILE *in, *out;
in = fopen("milk3.in", "r");
out = fopen("milk3.out", "w");
int ans[] = {};
int i, j ,k; fscanf(in, "%d %d %d", &A, &B, &C); for(i = ; i <= ; i++)
{
for(j = ; j <= ; j++)
{
for(k = ; k <= ; k++)
{
state[i][j][k] = ;
}
}
}
state[][][C] = ; int flag = ;
do{
flag = ; //注意:flag一定要写在这里 因为在扩展过程中,需要对state的所有状态循环多次 以防止在大序号状态下扩展了小序号状态 比如 2 0 8 扩展为 0 2 8 因为0 2 8的状态已经超过了 所以还要重新遍历一遍才可以
for(i = ; i <= A; i++)
{
for(j = ; j <= B; j++)
{
for(k = ; k <= C; k++)
{
if(state[i][j][k] == )
{
int aa, bb, cc;
aa = i, bb = j, cc = k;
pour(&aa, A, &bb, B);
if(state[aa][bb][cc] == )
{
state[aa][bb][cc] = ;
flag++;
} aa = i, bb = j, cc = k;
pour(&bb, B, &aa, A);
if(state[aa][bb][cc] == )
{
state[aa][bb][cc] = ;
flag++;
} aa = i, bb = j, cc = k;
pour(&aa, A, &cc, C);
if(state[aa][bb][cc] == )
{
state[aa][bb][cc] = ;
flag++;
} aa = i, bb = j, cc = k;
pour(&cc, C, &aa, A);
if(state[aa][bb][cc] == )
{
state[aa][bb][cc] = ;
flag++;
} aa = i, bb = j, cc = k;
pour(&bb, B, &cc, C);
if(state[aa][bb][cc] == )
{
state[aa][bb][cc] = ;
flag++;
} aa = i, bb = j, cc = k;
pour(&cc, C, &bb, B);
if(state[aa][bb][cc] == )
{
state[aa][bb][cc] = ;
flag++;
}
state[i][j][k]++;
} }
}
}
}while(flag > ); for(j = ; j <= ; j++)
{
for(k = ; k <= ; k++)
{
if(state[][j][k] != && ans[k] == )
{
ans[k] = ;
}
}
} for(i = ; i < C; i++)
{
if(ans[i] == )
{
fprintf(out, "%d ", i);
}
}
fprintf(out, "%d\n", C); return ;
}

【USACO】milk3的更多相关文章

  1. POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)

    POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...

  2. 1642: 【USACO】Payback(还债)

    1642: [USACO]Payback(还债) 时间限制: 1 Sec 内存限制: 64 MB 提交: 190 解决: 95 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 &quo ...

  3. 1519: 【USACO】超级书架

    1519: [USACO]超级书架 时间限制: 1 Sec 内存限制: 64 MB 提交: 1735 解决: 891 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 Farmer Jo ...

  4. Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers

    [USACO]1.1.2 贪婪的礼物送礼者 Greedy Gift Givers 题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for th ...

  5. 【CPLUSOJ】【USACO】【差分约束】排队(layout)

    [题目描述] Robin喜欢将他的奶牛们排成一队.假设他有N头奶牛,编号为1至N.这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认 ...

  6. 【USACO】Dining

    [题目链接] [JZXX]点击打开链接 [caioj]点击打开链接 [算法] 拆点+网络流 [代码] #include<bits/stdc++.h> using namespace std ...

  7. 【USACO】Optimal Milking

    题目链接 :        [POJ]点击打开链接        [caioj]点击打开链接 算法 : 1:跑一遍弗洛伊德,求出点与点之间的最短路径 2:二分答案,二分”最大值最小“ 3.1:建边,将 ...

  8. 【USACO】 Balanced Photo

    [题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...

  9. 【USACO】 Balanced Lineup

    [题目链接] 点击打开链接 [算法] 这是一道经典的最值查询(RMQ)问题. 我们首先想到线段树.但有没有更快的方法呢?对于这类问题,我们可以用ST表(稀疏表)算法求解. 稀疏表算法.其实也是一种动态 ...

随机推荐

  1. [NOIP2010] 提高组 洛谷P1541 乌龟棋

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  2. TYVJ1038 忠诚

    hzw学长博客里的2048,根本停不下来! 描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要 求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意. ...

  3. bzoj2096 pilots

    依旧是维护两个单调队列,只是队首检查的方式略有变动 /*by SilverN*/ #include<iostream> #include<algorithm> #include ...

  4. javascript “||”、“&&”的灵活运用

    主要介绍了||和 &&的作用 1.|| 和Java中不一样 代表的是 如果左边的true就返回左边 否则返回右边 2.&& 和java中不一样 代表的是 如果左边返回的 ...

  5. stl 迭代器(了解)

    STL 主要是由 containers(容器),iterators(迭代器)和 algorithms(算法)的 templates(模板)构成的. 对应于它们所支持的操作,共有五种 iterators ...

  6. Why The Golden Age Of Machine Learning is Just Beginning

    Why The Golden Age Of Machine Learning is Just Beginning Even though the buzz around neural networks ...

  7. Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  8. java如何去调用C++的方法详解

    这是一个调用c++ jni 的列子 首先写一个GoodLuck 类,里面包含native本地方法,这是用作C/C++实现的.也就是用C/c++实现java的native 方法.public class ...

  9. [实战]MVC5+EF6+MySql企业网盘实战(27)——应用列表

    写在前面 本篇文章将实现应用列表,同样和其他列表的不同之处,在于查询条件的不同. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘 ...

  10. [Winform]一个简单的账户管理工具

    最近一直觉得注册的账户越来越多,帐号密码神马的容易弄混.自己就折腾了一个简单的账户管理工具,其实实现也挺简单,将每个账户的密码及相关密码提示信息,经aes算法加密之后保存到数据库,当前登录用户可以查询 ...