Задача об инфекции стригущего лишая - Lisp
Формулировка задачи:
Помогите разработать архитектуру программы для решения такой задачи:
Собственно решение, как таковое, меня не интересует, я его и сам могу написать. Например, на C/C++/C#.
Под архитектурой я понимаю взаимодействие частей программы. Например, если бы я делал программу на объектно-ориентированном языке, то сделал бы объект Клетка, объект Карта и, пожалуй, объект ИтераторКлеток. Как-то так.
Я понимаю, что задачу можно решить "в лоб", без всякой архитектуры. Видел уже такие решения. Спасибо, не надо.
Промоделировать процесс распространения инфекции — стригущего лишая по участку кожи размером n x n (n — нечетное) клеток. Предполагается, что исходной зараженной клеткой кожи является центральная. В каждый интервал времени пораженная инфекцией клетка может с вероятностью 0,5 заразить любую из соседних здоровых клеток. По прошествии шести единиц времени зараженная клетка становится невосприимчивой к инфекции, возникший иммунитет действует в течение последующих четырех единиц времени, а затем клетка оказывается здоровой. В ходе моделирования описанного процесса выдавать текущее состояние моделируемого участка кожи в каждом интервале времени, отмечая зараженные, невосприимчивые к инфекции и здоровые клетки.
Решение задачи: «Задача об инфекции стригущего лишая»
textual
Листинг программы
typedef
struct Cell {
int health;
}
*Cell;
void
Cell_Init(Cell this)
{
this->health = 0;
}
void
Cell_Infect(Cell this)
{
this->health = 1;
}
int
Cell_IsIll(Cell this)
{
return this->health > 0 && this->health < 7;
}
void
Cell_PassTime(Cell this)
{
if( this->health != 0 ) {
this->health += 1;
if( this->health == 11 ) {
this->health = 0;
}
}
}
typedef
struct Field {
struct Cell cells[N+2][M+2];
}
*Field;
void
Field_Init(Field this)
{
int i, j;
for( i = 1; i < N+1; ++i ) {
for( j = 1; j < M+1; ++j ) {
cells[i][j] = 0;
}
}
}
Объяснение кода листинга программы
- Структура
Cellпредставляет собой ячейку с двумя полями:health(здоровье) типаintиthis(указатель на саму структуру). - Функция
Cell_Initинициализирует полеhealthструктурыCellзначением 0. - Функция
Cell_Infectизменяет значение поляhealthструктурыCellна 1, что означает заражение. - Функция
Cell_IsIllпроверяет значение поляhealthструктурыCellи возвращаетtrue, если значение находится в диапазоне от 1 до 6 (включительно), иfalseв противном случае. - Функция
Cell_PassTimeувеличивает значение поляhealthструктурыCellна 1. Если значение поляhealthстановится равным 11, то оно заменяется на 0, что означает выздоровление. - Структура
Fieldпредставляет собой поле (плоскость) с двумя массивами типаCell(ячейки). - Функция
Field_Initинициализирует все ячейки поля значением 0.