三个水杯问题
2016-03-30 09:05
337 查看
三个水杯
时间限制: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
源码:
#include <iostream> #include <queue> #include <memory.h> using namespace std; typedef struct restate{ int state[3];//分别记录当前解的三个水杯中水量 int step; //当前状态对应的倒水步数 }ResoveState; bool visited[100][100][100] ;//标识解是否出现过 ResoveState InitState,TargetState; //初始状态和目标状态 bool IsTargetState(ResoveState &temp_state){ if(temp_state.state[0]==TargetState.state[0]&& temp_state.state[1]==TargetState.state[1]&& temp_state.state[2]==TargetState.state[2]){ return true; }else{ return false; } } void PourWater(int destination,int resource,ResoveState &temp){ int water = InitState.state[destination]-temp.state[destination]; if(temp.state[resource]>=water){ temp.state[resource] -= water; temp.state[destination] += water; }else{ temp.state[destination] += temp.state[resource]; temp.state[resource] = 0; //whatch out the assignance should place the back } //cout<<"A :"<<temp.state[0]<<" B :"<<temp.state[1]<<" C :"<<temp.state[2]<<endl; } int BFS(){ queue<ResoveState> state_queue; ResoveState start_state; start_state.state[0] = InitState.state[0]; start_state.state[1] = 0; start_state.state[2] = 0; visited[start_state.state[0]] [start_state.state[1]] [start_state.state[2]] = true; start_state.step = 0; state_queue.push(start_state); while(!state_queue.empty()){ ResoveState temp = state_queue.front(); state_queue.pop(); if(IsTargetState(temp)){ return temp.step; }else{ for(int i=0;i<3;i++){ //i为resoure水杯 for(int j=1;j<3;j++){ int k = (i+j)%3; //k为destination要倒入水的目标水杯 if(temp.state[i]!=0&&temp.state[k]!=InitState.state[k]){ //如果resource水杯不是空的,并且destination水杯不是满的可以进行倒水 ResoveState new_temp = temp; PourWater(k,i,new_temp); new_temp.step = temp.step+1; if(visited[new_temp.state[0]] [new_temp.state[1]] [new_temp.state[2]] == false){ visited[new_temp.state[0]] [new_temp.state[1]] [new_temp.state[2]] = true; state_queue.push(new_temp); } } } } } } return -1; } int main(){ int test_num; cin>>test_num; while(test_num--){ cin>>InitState.state[0]>>InitState.state[1]>>InitState.state[2]; cin>>TargetState.state[0]>>TargetState.state[1]>>TargetState.state[2]; memset(visited,false,sizeof(visited)); cout<<BFS()<<endl; } return 0; }
相关文章推荐
- swift管理第三方框架
- DRBD(Distributed Replicated Block Device) 分布式块设备复制 进行集群高可用方案
- 中间件相关
- React.js入门学习第一篇
- oracle一些操作汇总
- twemproxy集群部署
- android 常用URI
- Myeclipse中出现@Override错误
- NPOI读写Excel
- HTML5 APP
- 为什么你的android代码这么混乱
- [转] Android OkHttp完全解析 是时候来了解OkHttp了
- 【图像处理】H.264流媒体播放
- Ubuntu64位下vlc-android编译及解决遇到的问题
- 消息中间件与RPC若干问题简析
- c# dotfuscator 混淆后无法使用
- Android - day five 绑定服务
- S5PV210的时钟系统简介
- Error parsing XML: not well-formed (invalid token) 报错+R文件消失解决的方法
- Android——图片视图(ImageView)、状态开关按钮(ToggleButton)、时钟、图片透明度、滚动和时间选择器