您的位置:首页 > 其它

三个水杯问题

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: