nyoj 21三个水杯(BFS + 栈)
题目链接: 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 + 栈)的更多相关文章
- NYOJ 21.三个水杯-初始态到目标态的最少次数-经典BFS
题目传送门:biubiubiu~ 三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子. ...
- NYOJ #21 三个水杯(bfs)
描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标 ...
- NYOJ 21 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...
- nyoj三个水杯(bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互 ...
- nyoj 题目21 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...
- 三个水杯 (bfs)
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ...
- nyoj 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ...
- nyoj 21-三个水杯(BFS)
21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装 ...
- 三个水杯(BFS)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 给出三个水杯.大小不一,而且仅仅有最大的水杯的水是装满的,其余两个为空杯子. 三个水杯之间相互倒水,而且水杯 ...
随机推荐
- Java 基本日期类使用(一)
一.java.util.Date Date表示特定的瞬间,精确到毫秒,其子类有Date.Time.Timestap.默认情况下输出的Date对象为:Mon Oct 13 17:48:47 CST 20 ...
- poj2459 Treasure Exploration (闭包+二分)
这道题是让求派出机器人的最少数量,乍一看以为是简单的求最小路径覆盖,后来发现错了,因为有的点可以走多次,而二分中每个点只能走一次,所以要先用floyd进行传递闭包,然后用二分 #include< ...
- OpenCV学习(1) RGB颜色空间
1.1彩色空间 颜色是外来的光刺激作用于人的视觉器官而产生的主观感觉,它具有色调.饱和度和亮度三个特性.物体的颜色不仅取决于物体本身,还与光源.周围环境的颜色,以及观察者的视觉系统有关 1.1.1颜色 ...
- Struts 2的iterator标签来遍历一个含有双层List的嵌套
今天碰到一个很有意思的问题,就是需要用Struts 2的iterator标签来遍历一个含有双层List的嵌套. 首先我们从最基础的说起,用iterator标签遍历一个List. 如果Action中有一 ...
- CentOS下重新安装yum
1,下载最新的yum-3.2.28.tar.gz并解压 #wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz#tar xvf yum- ...
- C#的线程池的那些事
最近在做站时发现,线程池的问题很棘手,所以总结了一篇关于线程池的文章,原文地址:http://www.shuonar.com/blog/ac16496b-87ec-4790-a9ea-d69bbffa ...
- 北广传媒RTMP流媒体服务器漏洞
北广传媒移动电视(http://www.bj-mobiletv.com/)的RTMP流媒体服务器有漏洞 该漏洞可以上我们通过他们的服务器向互联网直播视频 使用任意可以发布RTMP流媒体的客户端(例如: ...
- linux 磁盘空间扩容 vg(+pv) lv(+空间) lv(缩减磁盘空间)
preFace APP scenario description: 当你未能合理的规划存储时,在后期的维护工作中可能会涉及的存储的 再规划(eg,某一个 or 数个App 对某一个lv 即挂载点写Bi ...
- c# 搭建服务端 传输协议(2)
在网络的数据传输中,要将需要传输的数据转换为二进制数据后传输,才能被服务端正常的接收,socket传输中,接收到的数据都会被放入byte[]中存放,所以在数据发送前,对二进制的数组进行有规律的排序,才 ...
- 视频日志之android的总结与思考
四月份开始学android,并着手做这个项目,腾讯面试实习忙了半个月没有再做最终铩羽而归.做到5月30日,做了一个交差版,停下了差不多一个月,这两天再捡起完善一点. 项目是做一个视频保存和分享的网站, ...