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