private void PreCalculate() { int currentDepartmentIndex = StartDepartment; int nextDepartmentIndex = StartDepartment; var currentChecklist = new Checklist(NumberOfStamps); do { currentDepartmentIndex = nextDepartmentIndex; var currentDepartment = _storage.GetDepartment(currentDepartmentIndex); nextDepartmentIndex = currentDepartment.ProcessChecklist(currentChecklist); currentDepartment.Status = DepartmentStatus.Visited; if (_storage.Contains(currentDepartmentIndex, currentChecklist)) { currentDepartment.Status = DepartmentStatus.InCycle; currentChecklist.InCycle = true; if (!_storage.IsChecklistInCycle(currentDepartmentIndex, currentChecklist)) { _storage.ReplaceChecklist(currentDepartmentIndex, currentChecklist.Clone() as Checklist); } else { break; } } else { _storage.AddChecklist(currentDepartmentIndex, currentChecklist.Clone() as Checklist); } } while (currentDepartmentIndex != EndDepartment); foreach (var department in _storage.GetDepartments().Where(department => department.Status == DepartmentStatus.NotVisited)) { department.Status = DepartmentStatus.Inaccessible; } isReady = true; }