题目链接:点击进入
思路: 要求最短的操作此数当然就往BFS上靠,然后我们需要读懂题,3个杯子互相倒,6种情况,
然后如果杯子大小相同 那么只需要一次操作,如果大小不同,那就是当大的那个杯子装满1/2可乐,并且 可乐瓶中还有1/2时退出
AC:
#include<iostream>
#include<cstring>
#include<queue>
#include<stack>
#include<math.h>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
const int maxn = 101;
int bin[4];
bool inq[maxn][maxn];
struct node{
int water[4];
int step;
node(){
step = 0;
}
};
int BFS (){
memset(inq, 0, sizeof(inq));
node start;
start.water[0] = bin[0];
start.water[1] = 0;
start.water[2] = 0;
inq[0][0] = 1;
queue<node> q;
q.push(start);
node front, next;
while(!q.empty()){
front = q.front();
q.pop();
if(front.water[0] == front.water[1] && front.water[2] == 0){
return front.step;
}
for(int i = 0; i < 3; i ++){ //i向j倒水
for(int j = 0; j < 3; j++){
if(i == j) continue; // 杯子相同时跳过
if(front.water[i] > 0 && front.water[j] < bin[j]){
int temp = bin[j] - front.water[j];
next = front;
next.step += 1;
if(front.water[i] >= temp){
next.water[i] -= temp;
next.water[j] += temp;
}else{
next.water[i] = 0;
next.water[j] += front.water[i];
}
}
if(inq[next.water[i]][next.water[j]] == 0){
inq[next.water[i]][next.water[j]] = 1;
q.push(next);
}
}
}
}
return 0;
}
int main (){
while(cin >> bin[0] >> bin[1] >> bin[2] && bin[0] + bin[1] + bin[2]){
if(bin[0] % 2){
cout << "NO"<< endl;
}
else{
if(bin[1] < bin[2])
swap(bin[1] , bin[2]);
int ans = BFS();
if(ans){
cout << ans << endl;
}
else{
cout << "NO" << endl;
}
}
}
return 0;
}