题目链接:很可乐

解析:一个瓶子,容量为s。两个杯子,容量分别为n和m,问最少多少次倾倒才干将一瓶可乐均分为两份。

直接模拟每次的倾倒。然后递归求解。

能够加个预判的条件,要是s是奇数的时候,不管怎样也是分不均的。

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int s, n, m, ans;
bool vis[101][101][101], tg; //vis中。第一维是瓶子s,第二维是杯子n。第三维是杯子m void dfs(int x, int y, int z, int dep){
if((x == s/2 && y == s/2) || (x == s/2 && z == s/2) || (y == s/2 && z == s/2)){ //均分了
tg = true;
if(ans > dep) ans = dep;
return ;
}
//x->y
if(x > 0 && y < n){
int t = min(x, n-y);
if(!vis[x-t][y+t][z]){
vis[x-t][y+t][z] = true;
dfs(x-t, y+t, z, dep+1);
vis[x-t][y+t][z] = false;
}
}
//x->z
if(x > 0 && z < m){
int t = min(x, m-z);
if(!vis[x-t][y][z+t]){
vis[x-t][y][z+t] = true;
dfs(x-t, y, z+t, dep+1);
vis[x-t][y][z+t] = false;
}
}
//y->x
if(y > 0 && x < s){
int t = min(y, s-x);
if(!vis[x+t][y-t][z]){
vis[x+t][y-t][z] = true;
dfs(x+t, y-t, z, dep+1);
vis[x+t][y-t][z] = false;
}
}
//z->x
if(z > 0 && x < s){
int t = min(z, s-x);
if(!vis[x+t][y][z-t]){
vis[x+t][y][z-t] = true;
dfs(x+t, y, z-t, dep+1);
vis[x+t][y][z-t] = false;
}
}
//y->z
if(y > 0 && z < m){
int t = min(y, m-z);
if(!vis[x][y-t][z+t]){
vis[x][y-t][z+t] = true;
dfs(x, y-t, z+t, dep+1);
vis[x][y-t][z+t] = false;
}
}
//z->y
if(z > 0 && y < n){
int t = min(z, n-y);
if(!vis[x][y+t][z-t]){
vis[x][y+t][z-t] = true;
dfs(x, y+t, z-t, dep+1);
vis[x][y+t][z-t] = false;
}
}
} int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%d%d%d", &s, &n, &m) == 3){
if(s == 0 && n == 0 && m == 0) break;
if(s % 2){ puts("NO"); continue; } //s是奇数
ans = 0x7fffffff;
tg = false;
vis[s][0][0] = true;
dfs(s, 0, 0, 0);
if(tg) printf("%d\n", ans);
else puts("NO");
}
return 0;
}

HDU 1495 很可乐 (DFS)的更多相关文章

  1. HDU 1495 很可乐(BFS 倒水问题)

    题意  将体积为s的可乐  利用容积分别为n和m的两个杯子平均分为两份  至少须要倒多少次可乐 能够把容器s,n,m中装的可乐量看成一种状态 容器都是没有刻度的  所以每次倒可乐要么把自己倒完 要么把 ...

  2. HDU 1401 Solitaire 双向DFS

    HDU 1401 Solitaire 双向DFS 题意 给定一个\(8*8\)的棋盘,棋盘上有4个棋子.每一步操作可以把任意一个棋子移动到它周围四个方向上的空格子上,或者可以跳过它四个方向上的棋子(就 ...

  3. 【BFS】HDU 1495

    直达–> HDU 1495 非常可乐 相似题联动–>POJ 3414 Pots 题意:中文题,不解释. 思路:三个杯子倒来倒去,最后能让其中两个平分即可.可能性六种.判定的时候注意第三个杯 ...

  4. HDOJ(HDU).2660 Accepted Necklace (DFS)

    HDOJ(HDU).2660 Accepted Necklace (DFS) 点我挑战题目 题意分析 给出一些石头,这些石头都有自身的价值和重量.现在要求从这些石头中选K个石头,求出重量不超过W的这些 ...

  5. HDOJ(HDU).1045 Fire Net (DFS)

    HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...

  6. HDOJ(HDU).1241 Oil Deposits(DFS)

    HDOJ(HDU).1241 Oil Deposits(DFS) [从零开始DFS(5)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架 ...

  7. HDOJ(HDU).1035 Robot Motion (DFS)

    HDOJ(HDU).1035 Robot Motion [从零开始DFS(4)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DF ...

  8. HDU 1501 Zipper 【DFS+剪枝】

    HDU 1501 Zipper [DFS+剪枝] Problem Description Given three strings, you are to determine whether the t ...

  9. BFS(倒水问题) HDU 1495 非常可乐

    题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...

随机推荐

  1. 模型构建<3>:交叉验证

    交叉验证是模型比较选择的一种常用方法,本文对此进行总结梳理. 1.交叉验证的基本思想 交叉验证(cross validation)的基本思想就是重复地利用同一份数据. 2.交叉验证的作用 1)通过划分 ...

  2. 利用meterpreter下的Venom免杀后门

    转载请注明作者:admin-神风 下载地址:https://github.com/r00t-3xp10it/venom .从Github上下载框架: tar.gz OR zip OR git clon ...

  3. hdu 4540 dp

    题意: 假设: 1.每一个时刻我们只能打一只地鼠,并且打完以后该时刻出现的所有地鼠都会立刻消失: 2.老鼠出现的位置在一条直线上,如果上一个时刻我们在x1位置打地鼠,下一个时刻我们在x2位置打地鼠,那 ...

  4. python开发_xml.etree.ElementTree_XML文件操作_该模块在操作XML数据是存在安全隐患_慎用

    xml.etree.ElementTree模块实现了一个简单而有效的用户解析和创建XML数据的API. 在python3.3版本中,该模块进行了一些修改: xml.etree.cElementTree ...

  5. Codeforces Round #222 (Div. 1) D. Developing Game 扫描线

    D. Developing Game 题目连接: http://www.codeforces.com/contest/377/problem/D Description Pavel is going ...

  6. newtonsoft动态修改JObject

    直接上代码: var data = new { mobile = ", company = ", isTravel = ", invoiceId = ", se ...

  7. WinPE作为启动硬盘

    之前我一直是用UltraISO将U盘制作为启动盘,这种方式本身简单易用,但也有一些令人不爽的地方 每次都要重新格式化U盘, 本身WinPE并不大,只需要几百兆空间,一旦U盘在使用时,明明都有足够的空间 ...

  8. hadoop学习;Streaming,aggregate;combiner

    hadoop streaming同意我们使用不论什么可运行脚本来处理按行组织的数据流,数据取自UNIX的标准输入STDIN,并输出到STDOUT 我们能够用 linux命令管道查看文本有多少行,cat ...

  9. CAN 总线通信控制芯片SJA1000 的读写

    SJA1000 控制信号的产生 CAN总线通信控制芯片SJA1000 没有提供单独的地址线,而使用可以与Intel 和Motorola系列微控制器兼容的分时复用地址/ 数据线.在一个读写周期内,微控制 ...

  10. Linux下分割、合并文件——dd和cat

    功能说明:读取,转换并输出数据. 语 法:dd [bs=<字节数>][cbs=<字节数>][conv=<关键字>][count=<区块数>][ibs=& ...