using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JugPuzzle
{
class Program
{
static void Main(string[] args)
{
int capacityA;
int capacityB;
int gcd;
int target;
Console.WriteLine("Jug Puzzle!");
Console.WriteLine("Please input cylinderA capacity"); //key in
capacityA = int.Parse(Console.ReadLine());
Console.WriteLine("Please input cylinderB capacity");
capacityB = int.Parse(Console.ReadLine());
Console.WriteLine("Please input target capacity");
target = int.Parse(Console.ReadLine());
Console.WriteLine("*******************************************************");
gcd = Program.gcd(capacityA, capacityB); //find gcd
if (target % gcd == 0) //Is solvable?
{
if (capacityA + capacityB >= target)
{
Program.jugPuzzle(capacityA, capacityB, target);
}
else
{
Console.WriteLine("Not solvable!");
}
}
else
{
Console.WriteLine("Not solvable!");
}
Console.Read();
}
static int gcd(int m, int n) //最大公因數
{
int temp = 0;
while (n != 0)
{
temp = m % n;
m = n;
n = temp;
}
return m;
}
static void jugPuzzle(int capacityA, int capacityB, int target)
{
int tem;
int waterInA = 0;
int waterInB = 0;
if (capacityA > capacityB) //if capacityA>B, exchange each other
{
tem = capacityA;
capacityA = capacityB;
capacityB = tem;
Console.WriteLine("Capavity of B is smaller then capacity of A");
Console.WriteLine("Exchange: capavity of A is {0}(smaller), and capacity of B is {1}(larger)", capacityA, capacityB);
}
else if (capacityA < capacityB)
{
Console.WriteLine("Capavity of A is smaller than capacity of B");
}
else
{
Console.WriteLine("Capavity of A and capacity of B are same");
}
Console.WriteLine("*******************************************************");
while (true)
{
if (capacityA + capacityB == target) //if capacity A + capacity B = target
{
waterInA = capacityA;
waterInB = capacityB;
Console.WriteLine("Fill in cylinderA and cylinderB");
Console.WriteLine("cylinderA:({0}) cylinderB:({1})", waterInA, waterInB);
if (waterInA == target || waterInB == target || (waterInA + waterInB) == target)
{
break;
}
}
if (waterInA == 0) //if A is empty
{
waterInA = capacityA;
Console.WriteLine("Fill in cylinderA");
Console.WriteLine("cylinderA:({0}) cylinderB:({1})", waterInA, waterInB);
if (waterInA == target || waterInB == target || (waterInA + waterInB) == target)
{
break;
}
}
if (capacityB - waterInB > capacityA) //if A pour into B
{
waterInB = waterInB + waterInA;
waterInA = 0;
Console.WriteLine("CylinderA pour into cylinderB");
Console.WriteLine("cylinderA:({0}) cylinderB:({1})", waterInA, waterInB);
if (waterInA == target || waterInB == target || (waterInA + waterInB) == target)
{
break;
}
}
else
{
waterInA = waterInA - (capacityB - waterInB);
waterInB = capacityB;
Console.WriteLine("CylinderA pour into cylinderB");
Console.WriteLine("cylinderA:({0}) cylinderB:({1})", waterInA, waterInB);
if (waterInA == target || waterInB == target || (waterInA + waterInB) == target)
{
break;
}
}
if (waterInB == capacityB) //if B is full, pour out
{
waterInB = 0;
waterInB = waterInA;
waterInA = 0;
Console.WriteLine("CylinderB is full, pour out");
Console.WriteLine("And cylinderA pour into cylinderB");
Console.WriteLine("cylinderA:({0}) cylinderB:({1})", waterInA, waterInB);
if (waterInA == target || waterInB == target || (waterInA + waterInB) == target)
{
break;
}
}
}
Console.WriteLine("Done!");
}
}
}
2015年3月26日 星期四
[2015][Homework]Team04 - Hw04
訂閱:
張貼留言 (Atom)
我輸入兩個為水杯為3跟5
回覆刪除目標是10
會進入無窮迴圈...
已修正~~~謝謝你~~~
刪除