Beispiel #1
0
        static void Main(string[] args)
        {
            var bottle1      = new Bottle(5);
            var bottle2      = new Bottle(7);
            var wantedVolume = 1;

            var numberOfOperations = 1;

            while (true)
            {
                var isSolved = TryWithGivenNumberOfOperations(numberOfOperations, bottle1, bottle2, wantedVolume);
                if (isSolved)
                {
                    break;
                }
                numberOfOperations++;
            }
        }
Beispiel #2
0
        private static bool IsSolved(
            Bottle bottle1, Bottle bottle2,
            int wantedVolume, int[] operations)
        {
            if (bottle1.Content != wantedVolume &&
                bottle2.Content != wantedVolume &&
                bottle1.Content + bottle2.Content != wantedVolume)
            {
                return(false);
            }
            for (var i = 0; i < operations.Length; i++)
            {
                var operation = operations[i];
                Console.WriteLine((i + 1) + ": " + operationNames[operation]);
            }

            return(true);
        }
 private static void DoOperations(int[] operations, Bottle bottle1, Bottle bottle2)
 {
     bottle1.Empty();
     bottle2.Empty();
     foreach (var operation in operations)
     {
         if (operation == 0)
         {
             bottle1.FillToTopFromTap();                         // Fylle flaske 1 fra springen
         }
         else if (operation == 1)
         {
             bottle2.FillToTopFromTap();                         // Fylle flaske 2 fra springen
         }
         else if (operation == 2)
         {
             bottle2.Fill(bottle1.Empty());                      // Tømme flaske 1 i flaske 2 -
         }
         // Tanken er at Empty() returnerer hvor mye det var i flasken før den ble tømt
         else if (operation == 3)
         {
             bottle1.Fill(bottle2.Empty());                      // Tømme flaske 2 i flaske 1
         }
         else if (operation == 4)
         {
             bottle2.FillToTop(bottle1);                         // Fylle opp flaske 2 med flaske 1
         }
         // Tanken er at FillToTop tar en annen Bottle som parameter. Hvis det er nok, fyller den
         // bottle2 og reduserer bottle1 tilsvarende. Hvis ikke gjør den ingenting.
         else if (operation == 5)
         {
             bottle1.FillToTop(bottle2);                         // Fylle opp flaske 1 med flaske 2
         }
         else if (operation == 6)
         {
             bottle1.Empty();                                    // Tømme flaske 1 (kaste vannet)
         }
         else if (operation == 7)
         {
             bottle2.Empty();                                    // Tømme flaske 2 (kaste vannet)
         }
     }
 }
        private static bool TryWithGivenNumberOfOperations(int numberOfOperations, Bottle bottle1, Bottle bottle2, int wantedVolume)
        {
            Console.WriteLine("Prøver med " + numberOfOperations + " operasjon(er).");
            var operations = new int[numberOfOperations];

            while (true)
            {
                DoOperations(operations, bottle1, bottle2);
                var isSolved = IsSolved(bottle1, bottle2, wantedVolume, operations);
                if (isSolved)
                {
                    return(true);
                }
                var success = UpdateOperations(operations);
                if (!success)
                {
                    break;
                }
            }

            return(false);
        }
 public Simulation(int wantedVolume, int volumeBottle1, int volumeBottle2)
 {
     WantedVolume = wantedVolume;
     Bottle1      = new Bottle(volumeBottle1);
     Bottle2      = new Bottle(volumeBottle2);
 }