直达–> HDU 1495 非常可乐

相似题联动–>POJ 3414 Pots

题意:中文题,不解释。

思路:三个杯子倒来倒去,最后能让其中两个平分即可。可能性六种。判定的时候注意第三个杯子不能有水,倒的时候也要注意别超过了倒进去的杯子的容积。

a->b || a->c || b->a || b->c || c->a || c->b

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int vis[105][105][105];
struct node{
int s,n,m;
int step;
};
bool check(int S,int N,int M){
if(S==0&&(N==M))
return true;
if(N==0&&(S==M))
return true;
if(M==0&&(S==N))
return true;
return false;
}
int bfs(int S,int M,int N){
queue<node>Q;
node P,T;
P.s = S;
P.m = 0;
P.n = 0;
P.step = 0;
vis[S][0][0] = 1;
Q.push(P);
while(Q.size()){
P = Q.front();
Q.pop();
if(check(P.s,P.m,P.n)){
return P.step;
}
if(P.s){
if(P.s>N-P.n){
T.s = P.s-(N-P.n);
T.n = N;
T.m = P.m;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.s = 0;
T.n = P.s+P.n;
T.m = P.m;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
if(P.s>M-P.m){
T.s = P.s-(M-P.m);
T.m = M;
T.n = P.n;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.s = 0;
T.m = P.s+P.m;
T.n = P.n;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
}
if(P.m){
if(P.m>N-P.n){
T.m = P.m-(N-P.n);
T.n = N;
T.s = P.s;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.m = 0;
T.n = P.n+P.m;
T.s = P.s;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
if(P.m>S-P.s){
T.m = P.m-(S-P.s);
T.s = S;
T.n = P.n;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.m = 0;
T.s = P.s+P.m;
T.n = P.n;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
}
if(P.n){
if(P.n>S-P.s){
T.n = P.n-(S-P.s);
T.s = S;
T.m = P.m;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.n = 0;
T.s = P.s+P.n;
T.m = P.m;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
if(P.n>M-P.m){
T.n = P.n-(M-P.m);
T.m = M;
T.s = P.s;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.n = 0;
T.m = P.m+P.n;
T.s = P.s;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
}
}
return -1;
}
int main(){
int S,M,N;
while(~scanf("%d%d%d",&S,&N,&M)){
if(S==0&&N==0&&M==0){
break;
}
if(S%2){
printf("NO\n");
continue;
}
memset(vis,0,sizeof(vis));
int ans = bfs(S,M,N);
if(ans==-1) printf("NO\n");
else printf("%d\n",ans);
}
return 0;
}

【BFS】HDU 1495的更多相关文章

  1. 【BFS】hdu 1973 Prime Path

    题目描述: http://poj.org/problem?id=3414 中文大意: 使用两个锅,盛取定量水. 两个锅的容量和目标水量由用户输入. 允许的操作有:灌满锅.倒光锅内的水.一个锅中的水倒入 ...

  2. 【题解】HDU Homework(倍增)

    [题解]HDU Homework(倍增) 矩阵题一定要多多检查一下是否行列反了... 一百个递推项一定要存101个 说多了都是泪啊 一下午就做了这一道题因为实在是太菜了太久没写这种矩阵的题目... 设 ...

  3. 【BFS】POJ 3414

    直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...

  4. 【动态规划】HDU 5492 Find a path (2015 ACM/ICPC Asia Regional Hefei Online)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5492 题目大意: 一个N*M的矩阵,一个人从(1,1)走到(N,M),每次只能向下或向右走.求(N+ ...

  5. 【贪心】【模拟】HDU 5491 The Next (2015 ACM/ICPC Asia Regional Hefei Online)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5491 题目大意: 一个数D(0<=D<231),求比D大的第一个满足:二进制下1个个数在 ...

  6. 【动态规划】HDU 5781 ATM Mechine

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 题目大意: 一个人有[0,K]内随机的钱,每次可以随意取,但是不知道什么时候取完,取钱超过剩余 ...

  7. 【贪心】HDU 5783 Divide the Sequence

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5783 题目大意: 把一个N个数的数列拆成若干段,保证每一段的前缀和都非负,求最多能拆成多少段. 题目 ...

  8. 【动态规划】HDU 5791 Two

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5791 题目大意: A,B两个数列,问A的子集和B的子集相等的子集对数.子集内顺序按照数列顺序,相同的 ...

  9. 【动态规划】【KMP】HDU 5763 Another Meaning

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 题目大意: T组数据,给两个字符串s1,s2(len<=100000),s2可以被解读成 ...

随机推荐

  1. Javascript权威指南学习笔记

    第二章:词法结构 ;function a(){alert(2)};//前面的分号保证正确地语句解析 第三章:类型.值和变量 基本概念: 1.数据类型---能够表示并操作的值的类型叫做数据类型. 2.变 ...

  2. RubyOnRails local_assigns

    http://api.rubyonrails.org/classes/ActionView/Template.html#method-i-local_assigns Returns a hash wi ...

  3. C#高级编程笔记 2016年10月26日 MVC入门 Controller

    1.MVC的定义:   Models: Classes that represent the data of the application  and that use validation logi ...

  4. 使用angular.bootstrap() 完成模块的手动加载

    之前我们看到使用ng-app指令,可以实现模块的自动加载.现在我们看下,angular中如何手动加载模块.需要使用到angular.bootstrap这个函数. <html> <he ...

  5. Git使用- 基本命令

    $ git config --global user.name "Your Name"   全局 name 设置 $ git config --global user.email ...

  6. java+eclipse+selenium环境搭建

    这几天在学selenium,大头虾的我.安装环境还是遇到了挺多问题,赶紧来记录下.不然下次又...(参考虫师的<Selenium2 Java自动化测试实战>),就随便写写加深下自己的印象. ...

  7. adb connect 出现timeout的处理方式

    默认的timeout是5000ms毫秒,如果是断点调试的时候,经常会出现timeout, 所以修改这个值就不会出现timeout了, Eclipse下的设置位置: Window->Prefere ...

  8. Yii2 时间控件之把layDate做成widget

    实现效果如下 1.把layDate封装成Yii2的widget,存在 "\common\widgets"目录下,命名为DycLayDate,具体引用查看代码. 2.对应的model ...

  9. File文件的使用

    线程的停止: 1.停止一个线程一般是通过一个变量来控制 2.如果需要停止一个处于一个等待状态的线程,那么需要配合interrupture方法来完成 守护线程:(后台线程):在一个进程中只剩下守护线程, ...

  10. React学习笔记-6-运行中阶段介绍

    运行中可以使用的函数componentWillReceiveProps:父组件修改属性触发,可以修改新属性,修改状态.字面意思,组件将要接收属性,这个函数触发的时机就是组件的属性将要发生改变的时候,但 ...