2015年4月16日 星期四

[2015][Quiz]MidExam-R02945022

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;
            }
        }
    }
}

1 則留言:

  1. Process.Solve()裡面配合IsSovable()的寫法不錯,但是字少打一個"l".

    回覆刪除