JugPuzzle.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace JugPuzzle
{
public partial class JugPuzzle : Form
{
Process jug = new Process();
public JugPuzzle()
{
InitializeComponent();
txtCapacityA.Text = jug.capacityA.ToString();
txtCapacityB.Text = jug.capacityB.ToString();
txtTarget.Text = jug.target.ToString();
}
private void btnSolve_Click(object sender, EventArgs e)
{
jug.capacityA = Convert.ToInt16(txtCapacityA.Text);
jug.capacityB = Convert.ToInt16(txtCapacityB.Text);
jug.target = Convert.ToInt16(txtTarget.Text);
jug.message = txtMessage;
jug.Solve();
}
private void btnClear_Click(object sender, EventArgs e)
{
txtMessage.Clear();
}
}
}
Process.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace JugPuzzle
{
class Process
{
public int capacityA = 3;
public int capacityB = 4;
public int target = 5;
public TextBox message;
public void Solve()
{
int waterInA = 0;
int waterInB = 0;
if (IsSovable() == true)
{
Exchange();
message.AppendText("容器A容積為(" + capacityA.ToString() + "),容器B容積為(" + capacityB.ToString() + ")" + '\n');
message.AppendText("分水遊戲開始!" + '\n');
message.AppendText("=======================================" + '\n');
while (true)
{
if (capacityA + capacityB == target)
{
waterInA = capacityA;
waterInB = capacityB;
message.AppendText("將容器A和容器B裝滿" + '\n');
message.AppendText("(A,B)=(" + waterInA.ToString() + "," + waterInB.ToString() + ")" + '\n');
message.AppendText("=======================================" + '\n');
if (Done(waterInA,waterInB,target) == true)
{
break;
}
}
if (waterInA==0)
{
waterInA = capacityA;
message.AppendText("將容器A裝滿" + '\n');
message.AppendText("(A,B)=(" + waterInA.ToString() + "," + waterInB.ToString() + ")" + '\n');
message.AppendText("=======================================" + '\n');
if (Done(waterInA, waterInB, target) == true)
{
break;
}
}
if (capacityB-waterInB>waterInA)
{
waterInB = waterInB + waterInA;
waterInA = 0;
message.AppendText("將容器A的水倒進容器B" + '\n');
message.AppendText("(A,B)=(" + waterInA.ToString() + "," + waterInB.ToString() + ")" + '\n');
message.AppendText("=======================================" + '\n');
if (Done(waterInA, waterInB, target) == true)
{
break;
}
}
else
{
waterInA = waterInA - (capacityB - waterInB);
waterInB = capacityB;
message.AppendText("將容器A的水倒進容器B,直到容器B裝滿為止" + '\n');
message.AppendText("(A,B)=(" + waterInA.ToString() + "," + waterInB.ToString() + ")" + '\n');
message.AppendText("=======================================" + '\n');
if (Done(waterInA, waterInB, target) == true)
{
break;
}
}
if (waterInB==capacityB)
{
waterInB = 0;
waterInB = waterInA;
waterInA = 0;
message.AppendText("容器B水滿,將容器B的水全部倒掉" + '\n');
message.AppendText("再將容器A的水倒進容器B" + '\n');
message.AppendText("(A,B)=(" + waterInA.ToString() + "," + waterInB.ToString() + ")" + '\n');
message.AppendText("=======================================" + '\n');
if (Done(waterInA, waterInB, target) == true)
{
break;
}
}
}
}
else
message.AppendText("無解!" + '\n');
}
static int gcd(int numA,int numB)
{
int temp;
while (numB!=0)
{
temp = numA % numB;
numA = numB;
numB = temp;
}
return numA;
}
public bool IsSovable()
{
int gcd;
gcd = Process.gcd(capacityA, capacityB);
if (target%gcd==0)
{
if (capacityA + capacityB >= target)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
public void Exchange()
{
if (capacityA>capacityB)
{
int temp;
temp = capacityA;
capacityA = capacityB;
capacityB = temp;
}
}
public bool Done(int numA,int numB,int target)
{
if (numA == target)
{
message.AppendText("******************************************" + '\n');
message.AppendText("將容器A放置到磅秤上,炸彈解除!" + '\n');
return true;
}
else if (numB == target)
{
message.AppendText("******************************************" + '\n');
message.AppendText("將容器B放置到磅秤上,炸彈解除!" + '\n');
return true;
}
else if (numA + numB == target)
{
message.AppendText("******************************************" + '\n');
message.AppendText("將容器A與容器B放置到磅秤上,炸彈解除!" + '\n');
return true;
}
else
{
return false;
}
}
}
}
Process.Solve()裡面配合IsSovable()的寫法不錯,但是字少打一個"l".
回覆刪除