Министерство образования и науки Российской Федерации. СПбГЭТУ “ЛЭТИ”. ФКТИ, кафедра МОЭВМ. Отчёт по лабораторно-практической работе №2 Выполнил: Ткаченко П.А. Группа: 1303 Факультет: КТИ Проверил: Романенко Д.А. Санкт-Петербург,2013 1. Цель работы. Написать программу реализующую алгоритм «Эдемский сад». 2. Постановка задачи. Для данного кругового состояния определить, является ли данное состояние Эдемским садом или достижимым состоянием. 3. Анализ задачи. Кле́точный автома́т — дискретная модель, Включает регулярную решётку ячеек, каждая из которых может находиться в одном из конечного множества состояний, таких как 1 и 0. Решетка может быть любой размерности. Для каждой ячейки определено множество ячеек, называемых соседством. К примеру, соседство может быть определено как все ячейки на расстоянии не более 2 от текущей. Для работы клеточного автомата требуется задание начального состояния всех ячеек, и правил перехода ячеек из одного состояния в другое. На каждой итерации, используя правила перехода и состояния соседних ячеек, определяется новое состояние каждой ячейки. Обычно правила перехода одинаковы для всех ячеек и применяются сразу ко всей решётке. Правилом перехода в данной задаче является XOR(Left,Right). Состояние является достижимым, когда идентификатор состояния равен идентификатору автомата, иначе состояние называется эдемским садом. 4. Код программы. #include "include.h" #define max 20 class Edem { public: int mass[max]; int n; Edem(int temp[], int val) { for (int i = 0; i < val; i++) { mass[i] = temp[i]; } n = val; } int identification() { int ident = 0; for (int i = 0; i < n; i++) { ident += mass[i] * pow(2,i); } } return ident; int xor(int a, int b) { if (!a == !b || a == b) { return 0; } else return 1; } bool sad(int id) { bool flag = false; int next[max]; int ident; for (int i = 0; i < pow(2,n); i++) { ident = identification(); if (ident == id) { flag = true; break; } else { next[0] = xor(mass[1],mass[n-1]); for (int k = 1; k < n-1;k++) { next[k] = xor(mass[k-1],mass[k+1]); } next[n-1] = xor(mass[n-2],mass[0]); for (int k = 0; k < n; k++) { mass[k] = next[k]; } } } return flag; } }; bool check_spase (char c) { if (c == ' ' || c == '\t') return false; else return true; }; int main() { { setlocale(0,""); int massive[max]; int n; int id = 0; ifstream file ("fail.txt"); string line; char c; if (file.good()) while (!file.eof() ) { getline (file,line); int i = 0; string buf = ""; do { buf += line[i]; i++; } while (check_spase(line[i])); i++; id = atoi(buf.c_str()); buf = ""; do { buf += line[i]; i++; } while (check_spase(line[i])); i++; n = atoi(buf.c_str()); for (int y = 0; i < line.length(); y++) { buf = line[i]; massive[y] = atoi(buf.c_str()); i++; } Edem a(massive, n); if (a.sad(id)) cout << "reachable" << endl; else cout << "Garden of Eden" << endl; } file.close(); } else cout << "Unable to open file" << endl; system ("pause"); return 0; }; 5. Блок-Схема. 6. Примеры работы. Входные данные 312 5 01001 522 9 111110000 0 4 1111 12 3 101 100 10 000000001 717 6 111110 0 5 00000 7. Вывод. В ходе лабораторной работы был реализован алгоритм «Эдемский сад».