这个问题很简单。主要就是两种情况 iMax*i - iMin*j或者 iMin*j - iMax*(i-1)
由于对于打印方案的时候,结束判定错误,导致了两次错误提交。成绩不理想啊
#include <stdio.h>
int CalcHCF(int iMax, int iMin)
{
int m = iMax % iMin;
while(m != 0)
{
iMax = iMin;
iMin = m;
m = iMax % iMin;
}
return iMin;
}
int CalcLCM(int iMax, int iMin)
{
return iMax * iMin / CalcHCF(iMax, iMin);
}
void PrintTheMethod(int x, int y, int res)
{
int iMax, iMin;
char cMax, cMin;
x > y ? (iMax = x, cMax = 'A', iMin = y, cMin = 'B') : (iMax = y, cMax = 'B', iMin = x, cMin = 'A');
int lcm = CalcLCM(iMax, iMin);
int iMaxLen = lcm / iMax;
int iMaxIndex = 1, iMinIndex = 1;
bool bFind = false;
char iSolution; // 1: 使用iMax*i - iMin*j 方案 2:使用iMin*j - iMax*i方案
for (; iMaxIndex <= iMaxLen; iMaxIndex++)
{
for (; iMinIndex*iMin < iMaxIndex*iMax; iMinIndex++)
{
if((iMax*iMaxIndex - iMinIndex*iMin) == res)
{
iSolution = 1;
bFind = true;
break;
}
else if((iMinIndex*iMin - iMax*(iMaxIndex-1)) == res)
{
iSolution = 2;
bFind = true;
break;
}
}
if (bFind)
{
break;
}
}
//if (bFind)
//{
// 第一方案
// 1. fill Max 2. pour Max min if max > min then 3 else if got minindex then finished else 2 3. empty min then 2
if(iSolution == 1)
{
bool bFinished = false;
int iMaxNow = 1;
printf("fill %c\n", cMax);
for (int iMinNow = 1; iMinNow <= iMinIndex; iMinNow++)
{
printf("pour %c %c\n", cMax, cMin);
if(iMinNow * iMin >= iMaxNow*iMax)
{
iMaxNow++;
printf("fill %c\n", cMax);
printf("pour %c %c\n", cMax, cMin);
}
printf("empty %c\n", cMin);
}
}
// 第二方案
// 1.fill min 2. pour min max until max ful then 3 or got minidex then finished else 1 3.empty max 4. pour min max then 1
else
{
int iMaxNow = 1;
for (int iMinNow = 1; iMinNow <= iMinIndex; iMinNow++)
{
printf("fill %c\n", cMin);
printf("pour %c %c\n", cMin, cMax);
if(iMinNow*iMin > iMaxNow*iMax)
{
iMaxNow++;
printf("empty %c\n", cMax);
printf("pour %c %c\n", cMin, cMax);
}
}
}
//}
printf("success\n");
}
int main()
{
int x, y, res;
while (scanf("%d %d %d", &x, &y, &res) != EOF)
{
PrintTheMethod(x, y, res);
}
return 0;
}