标题:分红酒
有4个红酒瓶子,它们的容量分别是:9升, 7升, 4升, 2升
开始的状态是 [9,0,0,0],也就是说:第一个瓶子满着,其它的都空着。
允许把酒从一个瓶子倒入另一个瓶子,但只能把一个瓶子倒满或把一个瓶子倒空,不能有中间状态。这样的一次倒酒动作称为1次操作。
假设瓶子的容量和初始状态不变,对于给定的目标状态,至少需要多少次操作才能实现?
本题就是要求你编程实现最小操作次数的计算。
输入:最终状态(逗号分隔)
输出:最小操作次数(如无法实现,则输出-1)
例如:
输入:
9,0,0,0
应该输出:
0
输入:
6,0,0,3
应该输出:
-1
输入:
7,2,0,0
应该输出:
2
没办法提交,也不知道自己写的对不对,希望各位路过的大神指正
#include<cstdio>
#include<iostream>
using namespace std;
int b[4]={9,7,4,2};
int A[4]={9,0,0,0};
int main()
{
int a[4],count=0;
char e,f,g;
while(scanf("%d%c%d%c%d%c%d",&a[0],&e,&a[1],&f,&a[2],&g,&a[3])!=EOF){
if(a[0]==A[0]&&a[1]==A[1]&&a[2]==A[2]&&a[3]==A[3])count=0;
else {
for(int i=1;i<4;i++){
int flag=true;
if(a[i]>b[i]){
count=-1;break;
}else if(a[i]==b[i])
count++;
else if(a[i]<b[i]&&a[i]>0){
int m=a[i];
for(int i=1;i<4;i++){
if(m==b[i]){
flag=false;break;
}
}
if(flag){
count=-1;break;
}
else
count += 2;
}
}
}
printf("%d\n",count);
}
return 0;
}