コード例 #1
0
        /// <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);
            //}
        }