课程练习二-1017非常可乐

来源:互联网 发布:北京java培训 编辑:程序博客网 时间:2024/05/20 20:05
Problem Description
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
 

Input
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
 

Output
如果能平分的话请输出最少要倒的次数,否则输出"NO"。
 

Sample Input
7 4 3<br>4 1 3<br>0 0 0
 

Sample Output
NO<br>3
 

Author
seeyou
 
思路: 如果要平分,肯定得是偶数,先判断S是否为偶数;
对于可乐的转移总共有6种情况,S->M 、S->N、 N->S、 N->M、 M->N、 M->S
先对S、M、N调整次序,使得S>N>M;
只要满足:s=m+n或者m=s+n 即可 (2*s=S/ 2*m=S)
对于到可乐时注意判断杯子是否被倒满。
本来是按照上面的思路写的,测试数据总是不过,原因 :  4 1 3 按照上面的思路应该输出:2 。单例子给的是 :3
然后便找出老师上课讲的课件,原来这道题的均分要S、N均分,不是均分就ok,
题干不清晰 被误导

刚开始思路的代码;  
代码:
#include<iostream>
#include<queue>
#include<stdlib.h>
#include<string.h>
using namespace std;
int ans = 0;
bool flag[100][100];
struct data
{
int s, n, m;
int ans;
};
bool bfs(int s,int n,int m)
{
queue<data>Q;
        memset(flag, false, sizeof(flag));
data d;
d.m = 0; d.n = 0; d.s = s; d.ans = 0;
Q.push(d);
while (!Q.empty())
{
data q = Q.front();
Q.pop();
if (2 * q.s == s || 2 * q.m == s)
{
ans = q.ans;
return true;
}
if (q.n != n&&q.s>0)
{
data d1;
if (q.s >=(n-q.n)) //判断s->n是否能将n 倒满,以下的判断类似
{
d1.s = q.s - n+q.n;
d1.n = n;
}
else
{
d1.s = 0;
d1.n = q.s+q.n;
}
d1.m = q.m;
d1.ans = q.ans + 1;
if (!flag[d1.m][d1.n])
{
Q.push(d1);
flag[d1.m][d1.n] = true;
}
}
if (q.m !=m&&q.s>0)
{
data d2;
if (q.s>=(m-q.m))
{
d2.s = q.s + q.m-m;
d2.m = m;
}
else {
d2.s = 0;
d2.m = q.s+q.m;
}
d2.n = q.n;
d2.ans = q.ans + 1;
if (!flag[d2.m][d2.n])
{
Q.push(d2);
flag[d2.m][d2.n] = true;
}
}
if (q.n != n)
{
if (q.m >=0)
{
data d3;
d3.s = q.s;
if (q.m >= (n - q.n))
{
d3.n = n;
d3.m = q.m - n + q.n;
}
else
{
d3.n = q.n + q.m;
d3.m = 0;
}
d3.ans = q.ans + 1;
if (!flag[d3.m][d3.n])
{
Q.push(d3);
flag[d3.m][d3.n] = true;
}
}
}
if (q.m > 0 )
{
data d6;
d6.ans = q.ans + 1;
d6.m = 0;
d6.n = q.n;
d6.s = q.s + d6.m;
if (!flag[d6.m][d6.n])
{
Q.push(d6);
flag[d6.m][d6.n] = true;
}
}
if (q.n >0)
{
if (q.m!= m)
{
data d4;
d4.s = q.s;
if (q.n >= (m - q.m))
{
d4.m = m;
d4.n = q.n - m + q.m;
}
else
{
d4.m = q.m + q.n;
d4.n = 0;
}
d4.ans = q.ans + 1;
if (!flag[d4.m][d4.n])
{
Q.push(d4);
flag[d4.m][d4.n] = true;
}
}
if (q.s!= s)
{
data d5;
d5.ans = q.ans + 1;
if (q.n >= (s - q.s))
{
d5.s = s;
d5.n = q.n - s + q.s;
}
else
{
d5.s = q.s + q.n;
d5.n = 0;
}
d5.m = q.m;
if (!flag[d5.m][d5.n])
{
Q.push(d5);
flag[d5.m][d5.n] = true;
}
}
}
if (q.m == q.n&&q.m == q.s)
{
break;
}
}
return false;
}


int main()
{
int S, M, N;
while (cin >> S >> N >> M)
{
if (S == 0 && N == 0 && M == 0)
break;
if (N > M)
{
int temp = N;
N = M;
M = temp;
}
ans = 0;
if (S % 2 != 0)
cout << "NO" << endl;
else
{
if (bfs(S, N, M))
cout << ans << endl;
else cout << "NO" << endl;
}
}
system("pause");
return 0;
}

AC代码:(只需要该一下终止判断条件就行,其他的和上面一样)
#include<iostream>
#include<queue>
#include<string.h>
#include<stdlib.h>
using namespace std;
int ans = 0;
bool flag[100][100];
struct data
{
int s, n, m;
int ans;
};
bool bfs(int s,int n,int m)
{
queue<data>Q;
memset(flag, false, sizeof(flag));
data d;
d.m = 0; d.n = 0; d.s = s; d.ans = 0;
Q.push(d);
while (!Q.empty())
{
data q = Q.front();
Q.pop();
if (q.s == q.m && q.m+q.s == s)
{
ans = q.ans;
return true;
}
if (q.n != n&&q.s>0)
{
data d1;
if (q.s >=(n-q.n))
{
d1.s = q.s - n+q.n;
d1.n = n;
}
else
{
d1.s = 0;
d1.n = q.s+q.n;
}
d1.m = q.m;
d1.ans = q.ans + 1;
if (!flag[d1.m][d1.n])
{
Q.push(d1);
flag[d1.m][d1.n] = true;
}
}
if (q.m !=m&&q.s>0)
{
data d2;
if (q.s>=(m-q.m))
{
d2.s = q.s + q.m-m;
d2.m = m;
}
else {
d2.s = 0;
d2.m = q.s+q.m;
}
d2.n = q.n;
d2.ans = q.ans + 1;
if (!flag[d2.m][d2.n])
{
Q.push(d2);
flag[d2.m][d2.n] = true;
}
}
if (q.n != n)
{
if (q.m >=0)
{
data d3;
d3.s = q.s;
if (q.m >= (n - q.n))
{
d3.n = n;
d3.m = q.m - n + q.n;
}
else
{
d3.n = q.n + q.m;
d3.m = 0;
}
d3.ans = q.ans + 1;
if (!flag[d3.m][d3.n])
{
Q.push(d3);
flag[d3.m][d3.n] = true;
}
}
}
if (q.m > 0 )
{
data d6;
d6.ans = q.ans + 1;
d6.m = 0;
d6.n = q.n;
d6.s = q.s + d6.m;
if (!flag[d6.m][d6.n])
{
Q.push(d6);
flag[d6.m][d6.n] = true;
}
}
if (q.n >0)
{
if (q.m!= m)
{
data d4;
d4.s = q.s;
if (q.n >= (m - q.m))
{
d4.m = m;
d4.n = q.n - m + q.m;
}
else
{
d4.m = q.m + q.n;
d4.n = 0;
}
d4.ans = q.ans + 1;
if (!flag[d4.m][d4.n])
{
Q.push(d4);
flag[d4.m][d4.n] = true;
}
}
if (q.s!= s)
{
data d5;
d5.ans = q.ans + 1;
if (q.n >= (s - q.s))
{
d5.s = s;
d5.n = q.n - s + q.s;
}
else
{
d5.s = q.s + q.n;
d5.n = 0;
}
d5.m = q.m;
if (!flag[d5.m][d5.n])
{
Q.push(d5);
flag[d5.m][d5.n] = true;
}
}
}
if (q.m == q.n&&q.m == q.s)
{
break;
}
}
return false;
}


int main()
{
int S, M, N;
while (cin >> S >> N >> M)
{
if (S == 0 && N == 0 && M == 0)
break;
if (N > M)
{
int temp = N;
N = M;
M = temp;
}
ans = 0;
if (S % 2 != 0)
cout << "NO" << endl;
else
{
if (bfs(S, N, M))
cout << ans << endl;
else cout << "NO" << endl;
}
}
system("pause");
return 0;
}
0 0