113 lines
4.1 KiB
C#
113 lines
4.1 KiB
C#
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<Student> students;
|
|
static List<Session> sessions;
|
|
public static bool Arrange(BackendContext context)
|
|
{
|
|
Context = context;
|
|
students = context.Students.Where(it => 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;
|
|
}
|
|
}
|
|
}
|