課程練習二-1017非常可樂

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章