111,094
社区成员




public class Item
{
public string Name = string.Empty; //名称
public Item Next = null; //下一个
public int Count = default(int); //值班次数
public bool Tag = false; //在某一轮是否已经值过班
public Item() { }
public Item(string name) : this()
{ this.Name = name; }
public Item(string name, Item next) :this(name)
{ this.Next = next; }
}
public class Link
{
public event EventHandler LoopEnded = null; //当全部成员执行结束以后触发
private Item Head = null; //第一个成员
public string Name = string.Empty; //部门名称
public bool Tag = false; //某次部门循环结束
private bool CheckLoopEnded() //某次检查循环是否结束
{
if (Head == null) return true;
Item current = Head;
bool result = true;
while (result && current != null)
{
result &= current.Tag;
current = current.Next;
}
return result;
}
private void ClearTags()
{
Item current = Head;
while (current != null)
{
current.Tag = false;
current = current.Next;
}
}
public void Remove(string name) //某人请假
{
if (Head == null) return;
if (Head.Name == name) { Head = Head.Next; return; }
Item current = Head;
while (current.Next != null)
{
if (current.Next.Name == name)
current.Next = current.Next.Next;
current = current.Next;
}
}
public void Add(string name) //某人加入(请假回来)
{
Add(new Item(name));
}
public void Add(Item item) //某人加入(请假回来)
{
if (Head == null) { Head = item; return; }
Item current = Head;
while (current.Next != null) current = current.Next;
item.Next = null;
current.Next = item;
}
public void MoveNext() //循环一轮
{
if (Head == null || Head.Next == null) return;
Item result = Head;
Head = Head.Next;
result.Count++;
result.Tag = true;
Add(result);
if (CheckLoopEnded())
{
ClearTags();
if (LoopEnded != null) LoopEnded(this, null);
}
}
public void Debug()
{
Item current = Head;
while (current != null)
{
System.Diagnostics.Debug.Write(string.Format("{0}[{1}]\t", current.Name, current.Count));
current = current.Next;
}
System.Diagnostics.Debug.WriteLine(string.Empty);
}
}
public class Puzzle
{
Link[] links = null;
private string[][] _data = null;
public string[][] Data
{
get { return _data; }
set {
_data = value;
}
}
private void InitialLinks()
{
int i = default(int);
links = new Link[_data.GetLength(0)];
for (int j = 0; j < links.Length; j++)
{
links[j] = new Link();
links[j].LoopEnded += new EventHandler(Puzzle_TurnEnd);
}
foreach (string[] ret in _data)
{
Link l = links[i++];
foreach (string r in ret) l.Add(r);
}
}
private void Puzzle_TurnEnd(object sender, EventArgs e)
{
Link l = (sender as Link);
l.Tag = true;
}
public string[][] GetSchedule(int count, int department_count)
{
InitialLinks();
int k = 0;
for (int i = 1; i <= count; i++)
{
if (i == 2)
{
links[0].Remove("d2");//d2在第二天请假
}
else if (i == 4)
{
links[0].Add("d2");//d2在第4天请假回来
}
bool result = true;
for (int j = k; j < k + department_count; j++)
{
if (j >= links.Length) break;
Link l = links[j];
l.MoveNext();
l.Debug();
result &= l.Tag;
}
if (result)
{
System.Diagnostics.Debug.WriteLine("Turn End");
for (int j = k; j < k + department_count; j++)
{
if (j >= links.Length) break;
links[j].Tag = false;
}
if (k + department_count >= links.Length) k = 0;
else k += department_count;
}
System.Diagnostics.Debug.WriteLine(string.Empty);
}
return _data;
}
}