#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define LL __int64
#define mod 9973
#define N 100010 int n,m,s; bool vis[102][110][110];
struct asd{
int cup1;
int cup2;
int cup3;
int step;
};
asd q[N];
int head,tail; void bfs()
{
memset(vis,0,sizeof(vis)); head=0;tail=1;
q[head].cup1=s;
q[head].cup2=0;
q[head].cup3=0;
q[head].step=0;
vis[s][0][0]=1; int x,y,z;
while(head<tail)
{
int a=q[head].cup1;
int b=q[head].cup2;
int c=q[head].cup3; if(a==b&&a==s/2)
{
printf("%d\n",q[head].step);
return;
}
//cup1->cup2|cup1->cup3|先cup1->cup2后cup1->cup3
if(a>0)
{
//cup1->cup2只能倒满,或者倒不满
//不会出现倒不满的现象,只会倒不倒;
x=a-(n-b);
y=n;
z=c;
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
x=0;
y=n;
z=m;
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
x=(a-(m-c));
y=b;
z=m;
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
}
//cup2->cup1|cup2->cup3|\cup2->cup1;
if(b>0)
{
x=a+b;
y=0;
z=c;
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
if(b+c>=m)
{
x=a;
y=b-(m-c);
z=m;
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
x=s-m;
y=0;
z=m;
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
}
else
{
x=a;
y=0;
z=b+c;
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
}
}
//cup3->cup1|cup3->cup2\\cup3->cup1
if(c>0)
{
x=a+c;
y=b;
z=0;
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
if(b+c>=n)
{
x=a;
y=n;
z=c-(n-b);
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
x=s-n;
y=n;
z=0;
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
}
else
{
x=a;
y=b+c;
z=0;
if(!vis[x][y][z])
{
vis[x][y][z]=1;
q[tail].cup1=x;
q[tail].cup2=y;
q[tail].cup3=z;
q[tail].step=q[head].step+1;
tail++;
}
}
}
head++;
}
printf("NO\n");
} int main()
{
while(~scanf("%d%d%d",&s,&n,&m))
{
if(s==0&&n==0&&m==0)
break;
if(n<m)
{
int temp=n;
n=m;
m=temp;
}
if(n+m<s||n+m>s||s%2==1)
{
puts("NO");
continue;
}
bfs();
}
return 0;
}

hdoj1495简单BFS的更多相关文章

  1. LightOJ 1012 简单bfs,水

    1.LightOJ 1012  Guilty Prince  简单bfs 2.总结:水 题意:迷宫,求有多少位置可去 #include<iostream> #include<cstr ...

  2. POJ3185(简单BFS,主要做测试使用)

    没事做水了一道POJ的简单BFS的题目 这道题的数据范围是20,所以状态总数就是(1<<20) 第一次提交使用STL的queue,并且是在队首判断是否达到终点,达到终点就退出,超时:(其实 ...

  3. 【POJ 3669 Meteor Shower】简单BFS

    流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封 ...

  4. hdu1312 Red and Black 简单BFS

    简单BFS模版题 不多说了..... 直接晒代码哦.... #include<cstdlib> #include<iostream> #include<cstdio> ...

  5. 逃脱 (简单BFS)

    题目传送门 G逃脱  题目描述 这是mengxiang000和Tabris来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园 ...

  6. poj2251 三维简单BFS

    D - (热身)简单宽搜回顾 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  7. hdu2717Catch That Cow 简单BFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2717 刚开始思路错了,用的DP,一直WA,后来才发现是搜索,还是简单的BFS,顿时.... 思路: B ...

  8. luogu 2296 寻找道路 简单BFS

    简单的BFS,练习基础 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #defi ...

  9. poj 3414(简单bfs)

    题目链接:http://poj.org/problem?id=3414 思路:bfs简单应用,增对瓶A或者瓶B进行分析就可以了,一共6种状态. #include<iostream> #in ...

随机推荐

  1. Solidedge如何新建参考平面 参考面

    1 建立平行平面 点击平行平面 点击参考平面,输入相对距离   2 建立成角平面 先选择基准面,再选则旋转轴(第二次点击一个平面,该平面与基准面相交形成的直线即为旋转轴)   输入角度即可完成(鼠标左 ...

  2. 使用FMDB多线程訪问数据库,及database is locked的问题

    今天最终攻克了多线程同一时候訪问数据库时,报数据库锁定的问题.错误信息是: Unknown error finalizing or resetting statement (5: database i ...

  3. js跳出循环的方法区别( break, continue, return ) 及 $.each 的(return true 和 return false)

    js编程语法之break语句: break语句会使运行的程序立刻退出包含在最内层的循环或者退出一个switch语句. 由于它是用来退出循环或者switch语句,所以只有当它出现在这些语句时,这种形式的 ...

  4. Frame Relay - 简单介绍及基本配置

    Frame Relay如今越来越不流行了,只是在过去的设计中被广泛应用. 所以工作上还是能常常见到的, 这篇博文从二层简单总结下FR的一些概念 在介绍Frame Relay之前,先了解下广播介质和非广 ...

  5. XML语法笔记

    XML(可扩展标记语言) XML的特点: XML是一种标记语言,适合跨平台.跨语种信息交互XML被用于存储.传输数据XML可扩展性良好,没有预定义标签,需要用户自定义标签XML具有自我描述性XML采用 ...

  6. CSS transform旋转问题

    我们都知道css的transform可以让旋转多少角度:transform:rotate(90deg),但是设置后只能旋转一次,如何想让它一直旋转下去怎么办?一种是使用matrix属性获取当前tran ...

  7. 基于PHP函数的alert弹框

    可以设置弹出信息,跳转地址,跳转的时间,跳转的信息标题提示: 手机端加上<meta name='viewport' content='width=device-width, initial-sc ...

  8. LeetCode(27)题解:Remove Element

    https://leetcode.com/problems/remove-element/ Given an array and a value, remove all instances of th ...

  9. ubuntu16.04和服务器 caffe 安装

    在centos6.X上安装caffe 0.编译安装gcc4.8.5 由于centos6.x中的gcc版本老旧,不支持c++11所以要安装gcc4.8.5,以下是安装教程.参考CentOS 6.4 编译 ...

  10. ubuntu12.04配置NFS服务详解

    1:安装nfs sudo apt-get install nfs-kernel-server 2:配置服务 sudo vim /etc/exports 在末尾添加 /home/jyg *(rw,syn ...