using System; using System.Collections.Generic; using System.Linq; using _2021_backend.Data; using _2021_backend.Models; using System.IO; using System.Threading.Tasks; namespace _2021_backend.Utils { public class Arranger { static BackendContext Context; static List students; static List sessions; public static bool Arrange(BackendContext context) { Context = context; students = context.Students.Where(it => it.Status != status.不通过 && it.Status != status.已确认时间 && it.Timelist.Count != 0 && it.InterviewTime == Guid.Empty && it.Status != status.需调整时间).OrderBy(it => it.Timelist.Count).ToList(); sessions = context.Sessions.OrderBy(it => it.Day).ThenByDescending(it => it.Capacity - it.Students.Count).ThenBy(it => it.BeginTime).ThenBy(it => it.Place).ToList(); students.Sort((Student a, Student b) => { var capa = 0; var capb = 0; foreach (var tm in a.Timelist) { var t = sessions.Find(x => x.Guid == tm); capa += t.Capacity - t.Students.Count; } foreach (var tm in b.Timelist) { var t = sessions.Find(x => x.Guid == tm); capb += t.Capacity - t.Students.Count; } return capa - capb; }); #if DEBUG var str = ""; foreach(var st in students) { var cap = 0; var tmstr = ""; foreach (var tm in st.Timelist) { var t = sessions.Find(x => x.Guid == tm); cap += t.Capacity - t.Students.Count; tmstr += t.Day.ToString("dd") + "-" + t.BeginTime.ToString("HH:mm-") + t.Place + " "; } str += st.Name + "\t" + st.Timelist.Count.ToString() + "\t" + cap.ToString() + "\t"+ tmstr+ "\n"; } File.WriteAllText("./students.txt", str); #endif var res = DFS(0); context.SaveChanges(); return res; } static bool DFS(int m) { if (m >= students.Count) return true; var lst = students[m].Timelist; var stu = students[m]; if (stu.Timelist.Contains(stu.InterviewTime) || stu.Timelist.Count() == 0 || stu.InterviewTime != Guid.Empty || stu.Status != status.已选时间) { return m >= students.Count - 1 ? true : DFS(m + 1); } else { var tm = Context.Sessions.Find(stu.InterviewTime); if (tm != null) { tm.Students.RemoveAll(it => it == stu.Guid); } stu.InterviewTime = Guid.Empty; } bool depth = false; foreach (var i in lst) { var tm = sessions.Find(s => s.Guid == i); if (tm.Students.Count < tm.Capacity && tm.Day.CompareTo(DateTime.Now.AddHours(-14)) > 0) { status prev = students[m].Status; Guid prevs = students[m].InterviewTime; students[m].Status = status.已选时间; students[m].InterviewTime = tm.Guid; tm.Students.Add(students[m].Guid); if (m == students.Count - 1) { return true; } else { depth = true; if (!DFS(m + 1)) { students[m].Status = prev; students[m].InterviewTime = prevs; tm.Students.Remove(students[m].Guid); continue; } else return true; } } } if (!depth) Console.WriteLine("Unable to find an arrangement. Stack trace:"); Console.WriteLine(stu.Name + " " + stu.Stuid); return false; } } }