예제 #1
0
        ////////////////////////
        // Search.cc

        // Функция изучения предположений
        //
        // Рекурсивная функция
        // Возвращает true, если результат получен
        //            false, если ответ не был найден
        //
        private bool Search()
        {
            UInt16[,] Mtc = new UInt16[SDS, SDS];

            // Создание копии исходной матрицы для данного предположения
            Mtc = (UInt16[, ])Mtx.Clone();

            // Поиск первой невычисленной ячейки
            UInt16 i = 0, j = 0;

            for (i = 0; i < SDS; i++)
            {
                for (j = 0; j < SDS; j++)
                {
                    if (!IsPowOf2(Mtx[i, j]))
                    {
                        goto m1;
                    }
                }
            }

            // Решение уже найдено
            return(true);

m1:
            for (UInt16 k = 0; k < SDS; k++)
            {
                // Выполнение предположения (все цифры по порядку)
                Mtx[i, j] = (UInt16)(1 << k);

                // Прогонка матрицы с данным предположением
                // (копия матрицы с каждым вызовом функции является вынужденной мерой, т.к.
                // каждая прогонка почти полностью переписывает исходную матрицу)
                switch (UpdateMatrix())
                {
                // Если получен конечный результат, функция его возвращает
                case 1:
                    return(true);

                // Если результат требует уточнения
                case 0:
                    // Делается новое предположение
                    if (Search())
                    {
                        // Если оно дало конечный результат, нужно вернуть его наверх
                        return(true);
                    }
                    else
                    {
                        // Если нет, нужно восстановить матрицу
                        Mtx = (UInt16[, ])Mtc.Clone();
                    }
                    break;

                // Если получена ошибка при прогонке, нужно восстановить матрицу
                default:
                    Mtx = (UInt16[, ])Mtc.Clone();
                    break;
                }
            }

            // Правильных вариантов не найдено
            return(false);
        }