nyoj_21 三个水杯
2016-05-02 15:58
357 查看
三个水杯
时间限制:1000 ms | 内存限制:65535 KB难度:4
描述给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入
2 6 3 1 4 1 1 9 3 2 7 1 1
样例输出
3 -1
分析:
求最小步数,用广搜,每次有6种情况:
杯1→杯2,杯2→杯1
杯1→杯3,杯3→杯1
杯2→杯3,杯3→杯2
为了不超内存和时间,要减枝:
1.减去重复情况,用一个数组记录已搜索过的情况
2.杯a→杯b:若杯a为空舍弃,若杯b为满舍弃
下面代码有详细注释:
#include<cstdio> #include<cstring> #include<queue> using namespace std; struct Node { int v[3];//杯子当前水量 int t; //操作次数 }n; int vis[105][105][105];//记录已搜索的情况 queue<Node>s; int v[3];//杯子大小 void fun(int a,int b) { if(n.v[a]&&n.v[b]!=v[b])//减枝:判断杯a是否为空以及杯b是否已满 { Node m=n; if(m.v[a]>v[b]-m.v[b])//若杯a水量比杯b剩余容量大 { m.v[a]-=v[b]-m.v[b];//杯a的水量应减去杯b的剩余容量 m.v[b]=v[b];//杯b被装满 } else//若杯a水量小于等于杯b剩余容量 { m.v[b]+=m.v[a];//杯b水量应加上杯a水量 m.v[a]=0;//杯a变空 } if(!vis[m.v[0]][m.v[1]][m.v[2]])//如果该情况未被搜索过 { m.t++;//操作次数加1 s.push(m);//入队列 vis[m.v[0]][m.v[1]][m.v[2]]=1;//记录此次搜索 } } } int main() { int T; scanf("%d",&T); while(T--) { int e1,e2,e3; scanf("%d%d%d%d%d%d",&v[0],&v[1],&v[2],&e1,&e2,&e3); memset(vis,0,sizeof(vis)); s.push(Node{v[0],0,0,0});//初始情况入队列 vis[v[0]][0][0]=1; while(!s.empty()) { n=s.front(); s.pop(); if(n.v[0]==e1&&n.v[1]==e2&&n.v[2]==e3)//搜索到了目标状态 { printf("%d\n",n.t);//输出最小操作次数 s.push(Node{0,0,0,0});//为了与搜索不到作区分,特意让队列不空 break; } fun(0,1); fun(1,0); fun(0,2); fun(2,0); fun(1,2); fun(2,1); } if(s.empty())//若队列为空即搜索不到目标状态输出-1 printf("-1\n"); else//搜索到目标状态,清空队列 while(!s.empty()) s.pop(); } return 0; }
相关文章推荐
- C扩展 从共享内存shm到memcache外部内存
- python的subprocess无法进行通信(无法通过管道输入数据)的问题解决
- [__NSCFString ma_MD5String]: unrecognized selector sent to instance 0x7ffeb34aaa80'
- 23种设计模式(4):抽象工厂模式
- Linux对所有用户设置自动注销功能
- 数组与集合之间简单的相互转换
- 49-Reverse Linked List II
- Swift - 使用arc4random()、arc4random_uniform()取得随机数
- 模拟验证一致性非锁定读
- linux中动态链接延迟绑定的实现
- 普通人的编辑利器--VIM
- linux 权限
- 2011 聪明的质监员
- 复制多个文件到一个文件中
- 如何调试PHP程序
- 流与文件(Java核心技术卷Ⅱ)
- 水平导航栏
- 水平导航栏
- 水平导航栏
- 水平导航栏