main program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace waterjug
{
class Program
{
static void Main(string[] args)
{
function func = new function();
int maxVolumeA;
int maxVolumeB;
int goalVolume;
while (true)
{
maxVolumeA = int.Parse(Console.ReadLine());
maxVolumeB = int.Parse(Console.ReadLine());
goalVolume = int.Parse(Console.ReadLine());
if (func.IsLegalInput(maxVolumeA, maxVolumeB, goalVolume) == false)
//檢查輸入
{
Console.WriteLine("illegal input, try again!");
Console.ReadLine();
Console.Clear();
continue;
}
func.Waterjug(maxVolumeA, maxVolumeB, goalVolume);
Console.ReadKey();
Console.Clear();
}
}
}
}
function
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace waterjug
{
class function
{
public int Gcd(int a, int b)
{
int temp = 0; //以輾轉相除法計算最大公因數
int gcdA = a; //複製a, b以供計算
int gcdB = b;
while (gcdA != 0)
{
if (gcdB > gcdA)
{
temp = gcdA;
gcdA = gcdB;
gcdB = temp;
}
gcdA = gcdA % gcdB;
}
return gcdB;
}
public bool IsLegalInput(int a, int b, int c)
{
if ( (c % Gcd(a, b)) == 0 && c<=(a+b) && c>0 && b>0 && a>0)
{
return true;
}
else
{
return false;
}
}
public int PourVolumeA(int currentVolumeA, int currentVolumeB, int maxVolumeA, int maxVolumeB)
{
if(currentVolumeA <= (maxVolumeA-maxVolumeB))
{
currentVolumeA = currentVolumeA + currentVolumeB;
}
else
{
currentVolumeA = maxVolumeA;
}
return currentVolumeA;
}
public int PourVolumeB(int currentVolumeA, int currentVolumeB, int maxVolumeA, int maxVolumeB)
{
if (currentVolumeA <= (maxVolumeA - maxVolumeB))
{
currentVolumeB = 0;
}
else
{
currentVolumeB = currentVolumeB - (maxVolumeA - currentVolumeA);
}
return currentVolumeB;
}
public int Discard( int currentVolumeA , int maxVolumeA)
{
if(currentVolumeA == maxVolumeA)
{
currentVolumeA = 0;
}
return currentVolumeA;
}
public bool CheckAns(int currentVolumeA, int currentVolumeB, int goalVolume)
{
if (goalVolume <= currentVolumeA && goalVolume == currentVolumeA + currentVolumeB && (currentVolumeA == 0 || currentVolumeB == 0))
{
return true;
}
if (goalVolume > currentVolumeA && goalVolume == currentVolumeA + currentVolumeB)
{
return true;
}
else
{
return false;
}
}
public void Waterjug(int maxVolumeA, int maxVolumeB, int goalVolume)
{
int currentVolumeA = 0;
int currentVolumeB = 0;
if (maxVolumeB > maxVolumeA)
//使A為大容器,B為小容器
{
int temp;
temp = maxVolumeA;
maxVolumeA = maxVolumeB;
maxVolumeB = temp;
}
while(true)
{
int tempVolume=0;
if (maxVolumeA == goalVolume)
{
currentVolumeA = maxVolumeA;
Console.WriteLine("{0},{1}", currentVolumeA, currentVolumeB);
break;
}
currentVolumeB = maxVolumeB;
Console.WriteLine("{0},{1}", currentVolumeA, currentVolumeB);
if (CheckAns(currentVolumeA, currentVolumeB, goalVolume)==true)
{
break;
}
tempVolume = PourVolumeA(currentVolumeA, currentVolumeB, maxVolumeA, maxVolumeB);
currentVolumeB = PourVolumeB(currentVolumeA, currentVolumeB, maxVolumeA, maxVolumeB);
currentVolumeA = tempVolume;
Console.WriteLine("{0},{1}", currentVolumeA, currentVolumeB);
currentVolumeB = maxVolumeB;
Console.WriteLine("{0},{1}", currentVolumeA, currentVolumeB);
if (CheckAns(currentVolumeA, currentVolumeB, goalVolume) == true)
{
break;
}
tempVolume = PourVolumeA(currentVolumeA, currentVolumeB, maxVolumeA, maxVolumeB);
currentVolumeB = PourVolumeB(currentVolumeA, currentVolumeB, maxVolumeA, maxVolumeB);
currentVolumeA = tempVolume;
Console.WriteLine("{0},{1}", currentVolumeA, currentVolumeB);
if (CheckAns(currentVolumeA, currentVolumeB, goalVolume) == true)
{
break;
}
currentVolumeA = Discard(currentVolumeA, maxVolumeA);
Console.WriteLine("{0},{1}", currentVolumeA, currentVolumeB);
if (CheckAns(currentVolumeA, currentVolumeB, goalVolume) == true)
{
break;
}
tempVolume = PourVolumeA(currentVolumeA, currentVolumeB, maxVolumeA, maxVolumeB);
currentVolumeB = PourVolumeB(currentVolumeA, currentVolumeB, maxVolumeA, maxVolumeB);
currentVolumeA = tempVolume;
Console.WriteLine("{0},{1}", currentVolumeA, currentVolumeB);
if (CheckAns(currentVolumeA, currentVolumeB, goalVolume) == true)
{
break;
}
}
}
}
}
沒有留言:
張貼留言