Dyikot
@Dyikot

В чем может быть ошибка при решении задания?

Ссылка на само задание.
Пару месецев назад, вроде даже на Habr QA нашел вопрос и там было скинуто много ссылок на задания. Примеры заданий на собеседования. Ну вот решил ради интереса посмотреть пару и показалось интересным одно задание. Решил его сохранить и вот теперь спустя пару месяцев на каникулах решил решить. Где-то на полове решений все казалось должно работать, но возможно я что-то не понимаю?
Мой путь решений:
Уже сейчас думаю лучше было бы использовать классы для облегчения понимаю кода, но об этом позно подумал и сделал на массивах.
План решения:
1) Найти все возможные "зеленые" квадраты, ну или комбинация 4 квадратов подходящий под "зеленое" условие.
2) Объеденить 5 подходящих зеленых квадратов чтобы получилась данныя фигура. (я тут)
3) Отсечь фигуры не подходящие под "желтые условия".
Поиск все возможных зеленых квадратов нашел обойдя в цикле все возможные размещения квадратов. Получается k = 4 и n = 12 и по итогу количество циклов составило 11880 из которых под условие из файла squares0.txt подходят 777 зеленых квадратов. Тут все правильно?
Ну а дальше просто в тупую назначаю первый элемент массива как центральных и проверяю последующие подходят они к этому сверху, снизу, слева и справа. Если нет назначаю второй как центральный и т.д до конца массива. И вот тут пробмела что такой комбинации нету и максимум что он находил это все кроме левого зеленого квадрата. По идеи если как в задании сказано найти чтобы выполнялись все уловия то должен же быть такой зеленый квадрат в центре к которому со всех сторон подойдут другие. В чем моя ошибка?

Если нужен код (C#)
string filePath = @"Squares.txt";
            List<List<int>> squares = new();
            List<List<string>> squaresString = new();

            // Getting squares.

            File.ReadAllLines(filePath).ToList().ForEach(squareString =>
                squaresString.Add(squareString.Split(' ').ToList()));
            squaresString.ForEach(squareString =>
            {
                List<int> square = new();
                squareString.ForEach(number => square.Add(int.Parse(number)));
                squares.Add(square);
            });

            // Searching for squares matching the green condition.

            List<List<int>> greenSquares = new();
            int first = 0, second = 1, third = 2, fourth = 3;
            const int maxNumber = 11, minNumber = 0;
            bool isNewCheck4, isNewCheck3, isNewCheck2;

            while(first != maxNumber || second != maxNumber - 1 || third != maxNumber - 2 ||
                fourth != maxNumber - 3)
            {
                isNewCheck2 = isNewCheck3 = isNewCheck4 = true;

                if (DoSquaresFitToGreenCondition(squares[first], squares[second], squares[third],
                    squares[fourth]))
                {
                    greenSquares.Add(new List<int> { first, second, third, fourth });
                }
                
                while (isNewCheck4 || fourth == third || fourth == second || fourth == first)
                {
                    isNewCheck4 = false;
                    if (fourth == maxNumber)
                    {
                        fourth = minNumber;
                        while (isNewCheck3 || third == second || third == first)
                        {
                            isNewCheck3 = false;
                            if (third == maxNumber)
                            {
                                third = minNumber;
                                while (isNewCheck2 || second == first)
                                {
                                    isNewCheck2 = false;
                                    if (second == maxNumber)
                                    {
                                        second = minNumber;
                                        first++;
                                    }
                                    else
                                        second++;
                                }
                            }
                            else
                                third++;
                        }
                    }
                    else
                        fourth++;
                }
            }

            if (DoSquaresFitToGreenCondition(squares[first], squares[second], squares[third],
                    squares[fourth]))
            {
                greenSquares.Add(new List<int> { first, second, third, fourth });
            }

            // Grouping into 5 green squares.

            List<List<int>> groupGreenSquares = new();
            List<int>? upGreenSquare = null, downGreenSquare = null, leftGreenSquare = null,
                rightGreenSquare = null, middleGreenSquare = null;
            List<int> usingSquares = new();
            int cycle = 0;

            while ((upGreenSquare == null || downGreenSquare == null || leftGreenSquare == null ||
                rightGreenSquare == null) && cycle < greenSquares.Count)
            {
                middleGreenSquare = greenSquares[cycle++];
                rightGreenSquare = leftGreenSquare = upGreenSquare = downGreenSquare = null;

                for (int i = 0; i < greenSquares.Count && (upGreenSquare == null ||
                    downGreenSquare == null || leftGreenSquare == null ||
                    rightGreenSquare == null); i++)
                {
                    if (upGreenSquare == null &&
                        middleGreenSquare[0] == greenSquares[i][2] &&
                        middleGreenSquare[1] == greenSquares[i][3] &&
                        !usingSquares.Contains(greenSquares[i][0]) &&
                        !usingSquares.Contains(greenSquares[i][1]) &&
                        !middleGreenSquare.Contains(greenSquares[i][0]) &&
                        !middleGreenSquare.Contains(greenSquares[i][1]))
                    {
                        upGreenSquare = greenSquares[i];
                        usingSquares.AddRange(new int[] { upGreenSquare[0], upGreenSquare[1] });
                    }
                    else if (downGreenSquare == null &&
                        middleGreenSquare[2] == greenSquares[i][0] &&
                        middleGreenSquare[3] == greenSquares[i][1] &&
                        !usingSquares.Contains(greenSquares[i][2]) &&
                        !usingSquares.Contains(greenSquares[i][3]) &&
                        !middleGreenSquare.Contains(greenSquares[i][2]) &&
                        !middleGreenSquare.Contains(greenSquares[i][3]))
                    {
                        downGreenSquare = greenSquares[i];
                        usingSquares.AddRange(new int[] { downGreenSquare[2], downGreenSquare[3] });
                    }
                    else if (leftGreenSquare == null &&
                        middleGreenSquare[0] == greenSquares[i][1] &&
                        middleGreenSquare[2] == greenSquares[i][3] &&
                        !usingSquares.Contains(greenSquares[i][0]) &&
                        !usingSquares.Contains(greenSquares[i][2]) &&
                        !middleGreenSquare.Contains(greenSquares[i][0]) &&
                        !middleGreenSquare.Contains(greenSquares[i][2]))
                    {
                        leftGreenSquare = greenSquares[i];
                        usingSquares.AddRange(new int[] { leftGreenSquare[0], leftGreenSquare[2] });
                    }
                    else if (rightGreenSquare == null &&
                        middleGreenSquare[1] == greenSquares[i][0] &&
                        middleGreenSquare[3] == greenSquares[i][2] &&
                        !usingSquares.Contains(greenSquares[i][1]) &&
                        !usingSquares.Contains(greenSquares[i][3]) &&
                        !middleGreenSquare.Contains(greenSquares[i][1]) &&
                        !middleGreenSquare.Contains(greenSquares[i][3]))
                    {
                        rightGreenSquare = greenSquares[i];
                        usingSquares.AddRange(new int[] { rightGreenSquare[1], rightGreenSquare[3] });
                    }
                }
            }

            groupGreenSquares.AddRange(new List<List<int>>{ upGreenSquare, leftGreenSquare,
                middleGreenSquare, rightGreenSquare, downGreenSquare});
        }

        static bool DoSquaresFitToGreenCondition(List<int> fisrt, List<int> second,
            List<int> third, List<int> fourth)
        {
            return (fisrt[3] + second[2] + third[1] + fourth[0]) == 10;
        }
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
IMHO, тут нужет обычный рекурсивный алгоритм, только функция проверки получается довольно сложная.
Я бы написал функцию, которая по номеру позиции выдаёт ограничения на углы (min и max для каждого угла) при условии, что предыдущие позиции заполнены, а следующие ещё нет. Затем останется выбирать из оставшихся квадратов те, которые подойдут под ограничения на следующее поле, пробовать подставить их и решить ту же задачу с частично заполненным полем и оставшимися квадратами.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы