понеделник, 24 юни 2013 г.

C# програмиране - част I - Problem 3 – Bulls and Cows - Изпит на 23.06.2013

Задача 1
Задача 2
Задача 3
Задача 4
Задача 5

Здравейте,
Благодаря за търпението и че сте стигнали до 3-та задача.
Ето и впечатленията ми.

Условието на задачата може да изтеглите от тук: 3. Bulls and Cows.doc

На пръв поглед нищо сложно. Завъртях 4 вложени цикъла и проверявах за всеки получен вариант дали сравнено с secret се получава търсения брой бикове и крави. Бързо се видя че в отговорите не участва цифрата 0. Проблема дойде от алгоритъма за проверка колко бика и крави има. При положение че има повторение на цифрите се получават няколко варианта за броене, една и съща цифра, която се среща няколко пъти, колко пъти ще се брои. Но в крайна сметка намерих желания вариант и се получи.
Важно е след като се преброи дадена цифра да не може повторно да се брои. И първо да се преброят биковете.

Ето и моето решение (като изтрих CheckBullsAndCows - това е първия вариант на функцията):
using System;
using System.Collections.Generic;

class BullsAndCows
{
    static bool CheckBullsAndCows2(int sd1, int sd2, int sd3, int sd4, int d1, int d2, int d3, int d4, int bulls, int cows)
    {
        int newBulls = 0;
        int newCows = 0;
        if (sd1 == d1)
        {
            newBulls++;
            sd1 = -2;
            d1 = -1;
        }
        if (sd2 == d2)
        {
            newBulls++;
            sd2 = -2;
            d2 = -1;
        }
        if (sd3 == d3)
        {
            newBulls++;
            sd3 = -2;
            d3 = -1;
        }
        if (sd4 == d4)
        {
            newBulls++;
            sd4 = -2;
            d4 = -1;
        }
        //sd1
        if (sd1 >= 0)
        {
            bool hasCow = false;
            if (sd1 == d2)
            {
                hasCow = true;
                d2 = -1;
            }
            if (sd1 == d3)
            {
                hasCow = true;
                d3 = -1;
            }
            if (sd1 == d4)
            {
                hasCow = true;
                d4 = -1;
            }
            if (hasCow)
            {
                newCows++;
            }
        }
        //sd2
        if (sd2 >= 0)
        {
            bool hasCow = false;
            if (sd2 == d1)
            {
                hasCow = true;
                d1 = -1;
            }
            if (sd2 == d3)
            {
                hasCow = true;
                d3 = -1;
            }
            if (sd2 == d4)
            {
                hasCow = true;
                d4 = -1;
            }
            if (hasCow)
            {
                newCows++;
            }
        }
        //sd3
        if (sd3 >= 0)
        {
            bool hasCow = false;
            if (sd3 == d1)
            {
                hasCow = true;
                d1 = -1;
            }
            if (sd3 == d2)
            {
                hasCow = true;
                d2 = -1;
            }
            if (sd3 == d4)
            {
                hasCow = true;
                d4 = -1;
            }
            if (hasCow)
            {
                newCows++;
            }
        }
        //sd4
        if (sd4 >= 0)
        {
            bool hasCow = false;
            if (sd4 == d1)
            {
                hasCow = true;
                d1 = -1;
            }
            if (sd4 == d2)
            {
                hasCow = true;
                d2 = -1;
            }
            if (sd4 == d3)
            {
                hasCow = true;
                d3 = -1;
            }
            if (hasCow)
            {
                newCows++;
            }
        }
        return ((bulls == newBulls) && (cows == newCows));
    }

    static void Main()
    {
        string secretNumber = Console.ReadLine();
        int[] secretDigits = new int[4];
        for (int i = 0; i < 4; i++)
        {
            secretDigits[i] = secretNumber[i] - '0';
        }
        int bulls = int.Parse(Console.ReadLine());
        int cows = int.Parse(Console.ReadLine());
        bool hasAtLeastOnePrinted = false;
        for (int digit1 = 1; digit1 < 10; digit1++)
        {
            for (int digit2 = 1; digit2 < 10; digit2++)
            {
                for (int digit3 = 1; digit3 < 10; digit3++)
                {
                    for (int digit4 = 1; digit4 < 10; digit4++)
                    {
                        if (CheckBullsAndCows2(secretDigits[0], secretDigits[1], secretDigits[2], secretDigits[3], digit1, digit2, digit3, digit4, bulls, cows))
                        {
                            if (hasAtLeastOnePrinted)
                            {
                                Console.Write(" {0}{1}{2}{3}", digit1, digit2, digit3, digit4);
                            }
                            else
                            {
                                Console.Write("{0}{1}{2}{3}", digit1, digit2, digit3, digit4);
                                hasAtLeastOnePrinted = true;
                            }
                        }
                    }
                }
            }
        }
        if (!hasAtLeastOnePrinted)
        {
            Console.Write("No");
        }
        Console.WriteLine();
    }
}


Няма коментари:

Публикуване на коментар