/// <summary> /// 하나의 그룹에서 과목들의 가능한 조합들을 구하는 재귀함수 /// </summary> /// <param name="group">구할 그룹</param> /// <param name="cnt">남은 개수</param> /// <param name="p">현재 위치</param> private void SelectClasses(ClassGroup group, int cnt, int p = 0) { if (cnt == 0) { selectClassesResult.Add(selectClassesCurrent.Clone() as ScheduleMid); return; } if (p >= group.CountChildren()) { return; } //for (int i = p; i < group.CountChildren() - cnt + 1; i++) //{ foreach (ClassInfoPlus h in ((ClassGroup)group.Children[p]).Children) { if (!selectClassesCurrent.timemap.IsOverlap(h.Info.Time)) { selectClassesCurrent.timemap.Set(h.Info.Time); selectClassesCurrent.infos.Add(h); SelectClasses(group, cnt - 1, p + 1); selectClassesCurrent.timemap.Unset(h.Info.Time); selectClassesCurrent.infos.RemoveAt(selectClassesCurrent.infos.Count - 1); } } SelectClasses(group, cnt, p + 1); //} }