【BFS】HDU 1495
题意:中文题,不解释。
思路:三个杯子倒来倒去,最后能让其中两个平分即可。可能性六种。判定的时候注意第三个杯子不能有水,倒的时候也要注意别超过了倒进去的杯子的容积。
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的更多相关文章
- 【BFS】hdu 1973 Prime Path
题目描述: http://poj.org/problem?id=3414 中文大意: 使用两个锅,盛取定量水. 两个锅的容量和目标水量由用户输入. 允许的操作有:灌满锅.倒光锅内的水.一个锅中的水倒入 ...
- 【题解】HDU Homework(倍增)
[题解]HDU Homework(倍增) 矩阵题一定要多多检查一下是否行列反了... 一百个递推项一定要存101个 说多了都是泪啊 一下午就做了这一道题因为实在是太菜了太久没写这种矩阵的题目... 设 ...
- 【BFS】POJ 3414
直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...
- 【动态规划】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+ ...
- 【贪心】【模拟】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个个数在 ...
- 【动态规划】HDU 5781 ATM Mechine
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 题目大意: 一个人有[0,K]内随机的钱,每次可以随意取,但是不知道什么时候取完,取钱超过剩余 ...
- 【贪心】HDU 5783 Divide the Sequence
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5783 题目大意: 把一个N个数的数列拆成若干段,保证每一段的前缀和都非负,求最多能拆成多少段. 题目 ...
- 【动态规划】HDU 5791 Two
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5791 题目大意: A,B两个数列,问A的子集和B的子集相等的子集对数.子集内顺序按照数列顺序,相同的 ...
- 【动态规划】【KMP】HDU 5763 Another Meaning
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 题目大意: T组数据,给两个字符串s1,s2(len<=100000),s2可以被解读成 ...
随机推荐
- OpencV2.4.13前景提取示例代码
OpenCV2编译 基于高斯混合模型 #include<fstream> #include<iostream> #include<iostream> #inclu ...
- Json数组追加数据
背景:在做一个购物车的时候,点击第一个商品,然后存入一个json数组中,点击第二个商品的时候,又继续在json数组中追加,代码如下: <script type="text/javasc ...
- code first提示已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭解决方法
使用codefirst查询当然是必不可少的,但有时不小心可能很简单的查询也会导致异常. 下面用codefirst做个示例简单演示下异常发生的场景: var attendlist = db.Databa ...
- 461. Hamming Distance and 477. Total Hamming Distance in Python
题目: The Hamming distance between two integers is the number of positions at which the corresponding ...
- 求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法
今天面试,遇到面试官询求最大公约数.小学就学过的奥数题,居然忘了!只好回答分解质因数再求解! 回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:ht ...
- 【去除NSString 字符串中的空格换行符】
@interface NSString (DeletWhiteSpace) // 返回一个去掉前后空格的字符串或者下划线,如果自己是一个nil 返回@“” - (NSString *)trimming ...
- xml in SQL
几年前,学习html时,顺便把xml也学了哈,知道了xpath和xquery的概念,可都没去落实,下面这篇文章,可以学习学习 http://www.cnblogs.com/huyong/archive ...
- C#中的扩展方法
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方 ...
- Centos7学习之静态IP设置方法介绍
1.编辑 ifcfg-eth0 文件,vim 最小化安装时没有被安装,需要自行安装不描述. # vim /etc/sysconfig/network-scripts/ifcfg-eth0 2.修改 ...
- js中== 和===中的区别
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...