题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21

思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在加上栈的操作就能找到最后的路径(就是总共需要倒几次水);

操作:

  首先:将水杯初始化(A 0 0)进栈 当前倒水0次

  然后进行搜索,取出栈顶,判断是否是目标结果,不是则把这个状态进行转移(就是进行这个状态进行在一次倒水操作,)

  直到找到目标状态或是不能得到目标状态为止

这题感觉就是那个到倒水的时候处理不好处理 我是直接一步一步倒的

例如 A B C 三个水杯

首先进行A向 BC倒

再进行B 向 AC倒

最后是 C 向 AB倒

代码:

#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio> using namespace std; typedef struct numb
{
int ta,tb,tc;
int t;
numb()
{
ta = 0,tb = 0,tc = 0,t = 0;
}
}numb; int x,y,z;//初始状态
int x1,y1,z1;//目标状态
int tmp[101][101][101];//标记是否已经倒过 vector<numb>v;//使用vector 来模拟栈操作
vector<numb>::iterator p; void judge(numb ans,int t)//判断是否能入栈
{
if(tmp[ans.ta][ans.tb][ans.tc] == 0)
{
// cout<<"stack = "<<ans.ta<<" "<<ans.tb<<" "<<ans.tc<<endl;
tmp[ans.ta][ans.tb][ans.tc] = 1;
ans.t = t;
v.push_back(ans);
}
}
void water(int xx,int yy,int zz,int t)//倒水处理
{
numb ans;
int kk = 0;
if(xx > 0)//从x想yz倒水
{
if(yy < y)//到在y中
{
kk = y-yy;
if(kk >= xx)
{
ans.ta = 0; ans.tb = yy + xx; ans.tc = zz;
judge(ans,t);
}
else
{
ans.ta = xx - kk; ans.tb = yy + kk; ans.tc = zz;
judge(ans,t);
}
} if(zz < z)//到在z中
{
kk = z - zz;
if(kk >= xx)
{
ans.ta = 0; ans.tb = yy; ans.tc = zz + xx;
judge(ans,t);
}
else
{
ans.ta = xx - kk; ans.tb = yy; ans.tc = zz + kk;
judge(ans,t);
}
}
} if(yy > 0)
{
if(xx < x)
{
kk = x - xx;
if(kk >= yy)
{
ans.ta = xx + yy; ans.tb = 0; ans.tc = zz;
judge(ans,t);
}
else
{
ans.ta = xx + kk; ans.tb = yy - kk; ans.tc = zz;
judge(ans,t);
}
} if(zz < z)
{
kk = z - zz;
if(kk >= yy)
{
ans.ta = xx; ans.tb = 0; ans.tc = zz + yy;
judge(ans,t);
}
else
{
ans.ta = xx; ans.tb = yy - kk; ans.tc = zz + kk;
judge(ans,t);
}
}
} if(zz > 0)
{
if(xx < x)
{
kk = x - xx;
if(kk >= zz)
{
ans.ta = xx + zz; ans.tb = yy; ans.tc = 0;
judge(ans,t);
}
else
{
ans.ta = xx + kk; ans.tb = yy; ans.tc = zz - kk;
judge(ans,t);
}
} if(yy < y)
{
kk = y - yy;
if(kk >= zz)
{
ans.ta = xx; ans.tb = yy+zz; ans.tc = 0;
judge(ans,t);
}
else
{
ans.ta = xx; ans.tb = yy+kk; ans.tc = zz - kk;
judge(ans,t);
}
}
}
}
int BFS()//搜索
{
numb ans;
while(v.empty() != true)
{
ans = v[0];
p = v.begin();
v.erase(p);
//cout<<"ans = "<<ans.ta<<" "<<ans.tb<<" "<<ans.tc<<" "<<ans.t<<endl;
if(ans.ta == x1 && ans.tb == y1 && ans.tc == z1)
return ans.t;
else
water(ans.ta,ans.tb,ans.tc,++ans.t);
}
return -1;
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(tmp,0,sizeof(tmp));
cin>>x>>y>>z;
cin>>x1>>y1>>z1;
tmp[x][0][0] = 1;
numb ans;
ans.ta = x; ans.tb = 0; ans.tc = 0; ans.t = 0;
v.push_back(ans);
//water(100,0,0,0);
cout<<BFS()<<endl;
v.clear();
}
return 0;
}

  

---恢复内容结束---

nyoj 21三个水杯(BFS + 栈)的更多相关文章

  1. NYOJ 21.三个水杯-初始态到目标态的最少次数-经典BFS

    题目传送门:biubiubiu~ 三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子. ...

  2. NYOJ #21 三个水杯(bfs)

    描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标 ...

  3. NYOJ 21 三个水杯

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...

  4. nyoj三个水杯(bfs)

    三个水杯 时间限制:1000 ms  |           内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互 ...

  5. nyoj 题目21 三个水杯

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...

  6. 三个水杯 (bfs)

    给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ...

  7. nyoj 三个水杯

    三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ...

  8. nyoj 21-三个水杯(BFS)

    21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装 ...

  9. 三个水杯(BFS)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 给出三个水杯.大小不一,而且仅仅有最大的水杯的水是装满的,其余两个为空杯子. 三个水杯之间相互倒水,而且水杯 ...

随机推荐

  1. vsftpd限制用户不能更改根目录

    在IE下登陆会出现如下图所示情况,当时直接吓尿了,尼玛这台危险了.仔细一想可定是在配置vsftpd.conf时没有设置用户不能更改根目录:

  2. UITextField总结--博主总结的真好

    忍不住copy过来http://www.cnblogs.com/wengzilin/archive/2012/03/13/2393985.html 还有些不错的博客推荐给大家http://blog.c ...

  3. 转:IIS请求筛选模块被配置为拒绝超过请求内容长度的请求

    HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...

  4. Flink资料(4) -- 类型抽取和序列化

    类型抽取和序列化 本文翻译自Type Extraction and Serialization Flink处理类型的方式比较特殊,包括它自己的类型描述,一般类型抽取和类型序列化框架.该文档描述这些概念 ...

  5. xunsearch安装与卸载

    刚接触xunsearch(迅搜)的时候,我是排斥的.排斥的原因不是因为害怕学习新技术(其实我是对心技术很感兴趣),而是因为:一方面xunsearch是国人开发的,对于国人写的开源产品,我不是太感兴趣( ...

  6. OC中NSArray的使用

    不可变数组类容器类,管理一组对象类型的数据.   元素是有序的,索引值从0开始  数组中存储的元素必须是对象,类型任意.   创建数组对象,使⽤用实例初始化或便利构造器.获取元素个数.根据索引值获取对 ...

  7. Core开发-MVC 使用dotnet 命令创建Controller和View

    NET Core开发-MVC 使用dotnet 命令创建Controller和View   使用dotnet 命令在ASP.NET Core MVC 中创建Controller和View,之前讲解过使 ...

  8. Fidder 工具使用

    Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大 ...

  9. SQL Server用户自定义类型与统计信息

    用户自定义数据类型不支持统计信息! 所以查询对它的查询会慢一些.

  10. Linux 内存机制详解宝典

    Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...