Загрузка данных


#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>

// ==========================================
// ЗАДАЧА 1: Рекурсивная последовательность Фибоначчи
// ==========================================

// Рекурсивная функция для вычисления n-го числа Фибоначчи
// F(0) = 0, F(1) = 1
long long fibonacci(int n) {
    if (n == 0) return 0;
    if (n == 1) return 1;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

void solveTask1() {
    printf("\n--- ЗАДАЧА 1: Последовательность Фибоначчи ---\n");
    printf("Числа Фибоначчи от 0 до 2584:\n");

    int i = 0;
    long long currentFib = 0;

    // Выводим числа, пока не превысим 2584
    while (1) {
        currentFib = fibonacci(i);

        // Если число больше 2584, прерываем цикл
        if (currentFib > 2584) {
            break;
        }

        printf("%lld ", currentFib);
        i++;
    }
    printf("\n");
}

// ==========================================
// ЗАДАЧА 2: Игра "Сапёр" (упрощенная версия)
// ==========================================

#define SIZE 5 // Размер массива 5x5

// Глобальные переменные для игрового поля
int field[SIZE][SIZE];      // Скрытые значения (0-127)
int revealed[SIZE][SIZE];   // Состояние клеток (1 - открыта, 0 - закрыта)
int targetValue;            // Переменная, введенная пользователем

// Рекурсивная функция для открытия соседних клеток
// Если значение в клетке совпадает с targetValue, открываем её
// и рекурсивно проверяем соседей.
void openCell(int r, int c) {
    // Проверка выхода за границы массива
    if (r < 0 || r >= SIZE || c < 0 || c >= SIZE) {
        return;
    }

    // Если клетка уже открыта, ничего не делаем
    if (revealed[r][c] == 1) {
        return;
    }

    // Если значение клетки НЕ совпадает с искомым, не открываем её
    if (field[r][c] != targetValue) {
        return;
    }

    // Открываем клетку
    revealed[r][c] = 1;
    printf("Открыта клетка [%d][%d] со значением %d\n", r, c, field[r][c]);

    // Рекурсивно проверяем соседей (вверх, вниз, влево, вправо)
    // Можно также добавить диагонали, если требуется.
    openCell(r - 1, c); // Вверх
    openCell(r + 1, c); // Вниз
    openCell(r, c - 1); // Влево
    openCell(r, c + 1); // Вправо
}

void solveTask2() {
    printf("\n--- ЗАДАЧА 2: Игра Аналог Сапёра ---\n");

    // 1. Инициализация генератора случайных чисел
    srand(time(NULL));

    // 2. Ввод значения пользователем
    printf("Введите случайное значение (от 0 до 127): ");
    if (scanf("%d", &targetValue) != 1) {
        printf("Ошибка ввода. Завершение программы.\n");
        return;
    }

    // 3. Заполнение массива случайными числами и инициализация массива состояний
    // Числа от 0 до 127 включительно
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            field[i][j] = rand() % 128; // 0..127
            revealed[i][j] = 0;         // Все клетки изначально закрыты
        }
    }

    // Для наглядности выведем "скрытое" поле (обычно игрок его не видит)
    printf("\n[Скрытое поле для отладки]:\n");
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            printf("%3d ", field[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    // 4. Основная логика: пользователь "открывает" клетку.
    // В условии сказано: "Если пользователь открыл клетку, совпадающую с первой переменной..."
    // Мы должны сэмулировать это действие.
    // Обычно в Сапёре игрок выбирает координаты.
    // Но здесь условие звучит как: "Если пользователь открыл клетку... автоматически должны открыться все клетки с таким же значением".
    // Это означает, что нам нужно найти все клетки с targetValue и запустить рекурсию от них.
    // Либо мы можем предложить пользователю ввести координаты, но условие говорит "автоматически".
    // Давайте запустим проверку по всем клеткам, чтобы найти совпадения с targetValue.

    printf("Поиск и открытие всех клеток со значением %d...\n", targetValue);

    int foundAny = 0;
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            if (field[i][j] == targetValue && revealed[i][j] == 0) {
                openCell(i, j);
                foundAny = 1;
            }
        }
    }

    if (!foundAny) {
        printf("Клеток со значением %d не найдено.\n", targetValue);
    }

    // 5. Вывод итогового состояния поля (какие клетки открыты)
    printf("\nИтоговое состояние поля (1 - открыто, 0 - закрыто):\n");
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            printf("%d ", revealed[i][j]);
        }
        printf("\n");
    }
}

// ==========================================
// ГЛАВНАЯ ФУНКЦИЯ
// ==========================================

int main() {
    // Настройка кодировки для корректного отображения русского языка в Windows
    // Для Linux/macOS это обычно не требуется, но не помешает.
    setlocale(LC_ALL, "Russian");

    // Если вы используете Windows и русский язык не отображается,
    // раскомментируйте следующую строку (зависит от компилятора):
    // system("chcp 1251 > nul");

    solveTask1();
    solveTask2();

    printf("\nНажмите Enter для выхода...");
    getchar(); getchar(); // Ожидание нажатия клавиши
    return 0;
}