Загрузка данных
#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;
}