直达–> 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. Ubuntu14.04源

    Ubuntu14.04源:   来源: http://wiki.ubuntu.org.cn/Qref/Source (包含15.04.14.10.14.04.12.04.10.04的源)     Ub ...

  2. html5 json的新用法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 在CentOS 7.2下升级gcc编译器的版本

    默认情况下,CentOS 7.2预装的gcc版本是4.8.x,通过执行命令 gcc -v 可以看到,一般情况下这个版本的编译器已经满足需要了,但是某些特殊的时候为了支持C++更高的特性,需要对gcc编 ...

  4. 获取本地的IP地址(内网)

    方法一 public static String getLocalIpAddress() { try { for (Enumeration<NetworkInterface> en = N ...

  5. Reverse Core 第二部分 - 16&17章 - 基址重定位表&.reloc节区

    第16-17章 - 基址重定位表&.reloc节区 @date: 2016/11/31 @author: dlive 0x00 前言 这几天忙着挖邮箱漏洞,吃火锅,马上要被关禁闭,看书进度比较 ...

  6. Ubuntu 16.04 安装ftp服务器

    1.sudo apt-get update 2.sudo apt-get install vsftpd ,执行完该步骤,vsftpd服务已经安装 3.创建ftp用户 a,创建用户目录 sudo mkd ...

  7. Python列表去除重复元素

    主要尝试了3种列表去除重复元素 #2.去除列表中的重复元素 #set方法 def removeDuplicates_set(nums): l2 = list(set(l1)) #用l1的顺序排序l2 ...

  8. List提取相同元素

    List<int> currentList = Cls_Data.SoruceDataIntses[key]; preList = currentList.Intersect(preLis ...

  9. node的核心模块path

    //导入模块path var path=require("path"); //path.basename :输出文件名+后缀 //console.log(path.basename ...

  10. WPF 如何画一颗心

    如何用WPF画一个心. MainWindow.xaml <Window x:Class="Heart.MainWindow" xmlns="http://schem ...