2015年4月7日 星期二

[2015][Homework]Team06 - Hw04

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

沒有留言:

張貼留言