南阳理工21
来源:互联网 发布:淘宝上药店是真的吗 编辑:程序博客网 时间:2024/05/20 16:01
#include<iostream> #include<cstdio>#include<queue>#include<cstring> using namespace std;typedef struct{ int w[4]; int step;}node;int N;int V[4],E[4];bool visited[101][101][101];//用于 剪枝,visited[5][3][7]=true用来标记第1个杯子装5单位水, //第2个杯子装3单位水,第3个杯子装7单位水已经访问过, //以后遇到这种情况不用压入队列了 void Pour(int i,int k,node* next)//第i个杯子给k倒水,将结果存储在next中 { if(next->w[i] <= V[k] - next->w[k]) { next->w[k]=next->w[i]+next->w[k]; next->w[i]=0; } else { next->w[i]=next->w[i]-(V[k] - next->w[k]); next->w[k]=V[k]; } return;}void BFS(){ queue<node> q; node start,pr; memset(visited,false,sizeof(visited)); start.step=0; start.w[1]=V[1]; start.w[2]=0; start.w[3]=0; visited[start.w[1]][start.w[2]][start.w[3]]=true;//竟然忘了这一步 q.push(start); while(!q.empty()) { pr=q.front(); q.pop(); if(pr.w[1]==E[1] && pr.w[2]==E[2] && pr.w[3]==E[3]) { printf("%d\n",pr.step); return; } node next; //pr中的杯子倒水,将结果存储在next中 //共有6种情况,1倒给2,3 ,2倒给1,3,3倒给1,2 ,所以有下面代码 for(int i=0;i<3;i++) { for(int j=1;j<3;j++) { int k=(i+j)%3;//此式子可以保证当i+1为1时,k+1取2,3 //i+1=2时,k+1=1,3;i+1=3时,k+1=1,2 next=pr; Pour(i+1,k+1,&next); next.step=next.step+1; if(!visited[next.w[1]][next.w[2]][next.w[3]]) { visited[next.w[1]][next.w[2]][next.w[3]]=true; q.push(next); } } } } printf("%d\n",-1); return; }int main(){ scanf("%d",&N); for(int i=0;i<N;i++) { scanf("%d%d%d",&V[1],&V[2],&V[3]); scanf("%d%d%d",&E[1],&E[2],&E[3]); BFS(); } return 0;}
阅读全文
0 0
- 南阳理工21
- 南阳理工ACM 21 三个水杯
- 南阳理工OJ_题目21 三个水杯
- 南阳理工:水仙花数
- 南阳理工:韩信点兵
- 南阳理工:成绩转换
- 南阳理工:众数问题
- 南阳理工:组合数
- 南阳理工:日期计算
- 南阳理工:整除个数
- 南阳理工:字母统计
- 南阳理工:小学生算术
- 南阳理工:笨小熊
- 南阳理工:开灯问题
- 南阳理工:交换输出
- 南阳理工:大小写互换
- 南阳理工:分数加减法
- 南阳理工:无线网络覆盖
- 【解决方案】VS2013外部工具中添加ildasm.exe
- opencv3_java 图像的修剪裁剪Trimming Rect
- 关于给TextView等控件设置背景选择器
- ajax实战篇---天气或者其他股票连续变动----json交互
- C#多线程之旅(4)
- 南阳理工21
- C#多线程之旅(3)
- 【玖哥乱弹】程序员的健康
- 使用BigDecimal进行精确运算
- (199)材质编辑器
- 集合
- 干货分享:详解线程的开始和创建
- 3des加密解密
- C#多线程之旅(1)