Skip to content
This repository was archived by the owner on Jun 19, 2026. It is now read-only.

NNTU-CS/ADS-7

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Алгоритмы и структуры данных (ADS-7)

GitHub pull requests GitHub closed pull requests

Срок выполнения задания:

по 31.05.2026 Relative date

Задание

Написать программную реализацию решения задачи про круговой поезд с лампочками и провести вычислительный эксперимент для определения временной сложности

Пояснение

Формулировка задачи про поезд:

Представьте себе замкнутую по окружности железную дорогу. По ней едет поезд, последний вагон которого скреплён с первым так, что внутри можно свободно перемещаться между вагонами. Вы оказались в одном случайном вагоне и ваша задача — подсчитать их общее количество. В каждом вагоне можно включать или выключать свет, но начальное положение переключателей случайное и заранее неизвестно. Все вагоны внутри выглядят строго одинаково, окна закрыты так, что невозможно посмотреть наружу, движение поезда равномерное. Помечать вагоны как-либо, кроме включения или выключения света, нельзя. Количество вагонов конечно.

train

Программная реализация

В данной реализации используется класс Train, в котором содержится связанный список вагонов (Car)

class Train {
 private:
   struct Cage {
      bool light; // состояние лампочки
      Car *next;
      Car *prev;
   };
   int countOp; // счетчик шагов (число переходов из вагона в вагон)
   Car *first; // точка входа в поезд (первый вагон)
 public:
   Train(); 
   void addCar(bool light); // добавить вагон с начальным состоянием лампочки
   int  getLength();          // вычислить длину поезда
   int  getOpCount();         // вернуть число переходов (из вагона в вагон)
};

Поясним основные элементы класса Train. Поезд организуется как двусвязный циклический список из вагонов (структура Car). В каждом вагоне мы храним true, если свет включен и false, если выключен. Поезд может состоять минимум из 2-х вагонов.

При добавлении в поезд вагона мы передаем параметром состояние его лампочки (addCar). Метод getLength вычисляет длину поезда самым простым (и нерациональным способом!) Движения человека по поезду должны учитываться в переменной countOp, в которую заносятся все шаги из вагона в вагон.

Метод getOpCount возвращает общее число шагов.

Вычислительный эксперимент

Модифицировать код функции main.cpp для проведения вычислительного эксперимента. Необходимо построить график:

Зависимость числа операций от длины поезда n

  • если все лампочки выключены
  • если все лампочки включены
  • если распределение включенных/выключенных лампочек случайное

Построить графики с линиями тренда и сохранить в файле plot.png

Состав проекта

В проект должен входить заголовочный файл include/train.h. Файл src/train.cpp должен содержать реализацию методов класса. Файл src/main.cpp содержит пример использования класса Train. Файл result/plot.png содержит результаты вычислительного эксперимента.

Полезные ссылки (могут не работать :(

About

Задача про круговой поезд

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors