0

我正在尝试制作一个程序来创建成对的人,以便每周进行 1 对 1 的聊天。一个人不会与他们之前配对过的人配对(例如,[A,B] 在第 1 周,因此 [A,B] 或 [B,A] 不会在第 2 周再次出现),没有重复(eg. [A,B] 和 [B,A] 一样),一个人一周不能两对(eg. [A, B] 第1周见面,所以[A, C ] 不能在第 1 周见面,因为 A 已经成对了)。

它接收一个字符串数组,并将每个人与数组中的其他人配对。我还有一个数字从 1 到 n 的日期数组。您可以想象元素 1 是第 1 周,元素 2 是第 2 周,依此类推。

例如:


Input: string[] people = ["John", "David", "Mary", "Susan"] and int[] dates = [1,2,3]

Output: [(Week 1, "John", "David"), (Week 1, "Mary", "Susan"), (Week 2, "John", "Mary"), (Week 2, "David", "Susan"), (Week 3, "John", "Susan"), (Week 3, "David", "Mary")]

输出的格式无关紧要,它可以是元组数组、列表数组等。它只需要以某种方式传达星期和对。

我试过的

我是 C# 新手,我一直在尝试使用 Linq/MoreLinq 和 HashSets 来解决这个问题,但无济于事。我用这个创建了所有不同的组合:

var x = people
            .SelectMany(g => people
            .Select(c => new Tuple<string, string> (g, c)))
            .Where(x => x.Item1 != x.Item2).ToList() // To remove pairs where a person matches with itself
            .SelectMany(g => dates
            .Select(c => new Tuple<string, string, int>(g.Item1, g.Item2, c)))
            .OrderBy(x => x.Item3)
            .ToList();

然后尝试使用 HashSet 过滤掉无效的那些。元组包含 (Item1 = person1, Item2 = person2, Item3 = date)。

HashSet<Tuple<string, string>> previouslySelected = new HashSet<Tuple<string, string>>();
List<Tuple<string, string, int>> RemoveList2 = new List<Tuple<string, string, int>>(x);

foreach(var item in RemoveList2)
{
   if(previouslySelected.Contains(new Tuple<string, string>(item.Item1, item.Item2)) // Remove duplicates
   || previouslySelected.Contains(new Tuple<string, string>(item.Item2, item.Item1)) // Remove the inverse
   || previouslySelected.Contains(new Tuple<string, string>(item.Item1, item.Item3.ToString())) // Remove the rest of the pairs that have people that are already paired up for that week
   || previouslySelected.Contains(new Tuple<string, string>(item.Item2, item.Item3.ToString())))
   {
      x.Remove(item);
   } else
     {
       previouslySelected.Add(new Tuple<string, string>(item.Item1, item.Item2));
       previouslySelected.Add(new Tuple<string, string>(item.Item2, item.Item3.ToString()));
       previouslySelected.Add(new Tuple<string, string>(item.Item1, item.Item3.ToString()));
      }
   }

是的,这可能是一种非常迂回的方法,但我不确定如何去做,而且这个实现也不起作用。我得到:

(John, Jack, 1)
(David, Jesse, 1)
(Mary, Sally, 1)
(Lisa, Kevin, 1)
(Sue, Hansel, 1)
(Jen, Rachel, 1)

(John, David, 2)
(Jack, Jesse, 2)
(Mary, Lisa, 2)
(Sally, Kevin, 2)
(Sue, Jen, 2)
(Hansel, Rachel, 2)

(John, Jesse, 3)
(Jack, David, 3)
(Mary, Kevin, 3)
(Sally, Lisa, 3)
(Sue, Rachel, 3)
(Hansel, Jen, 3)

(John, Mary, 4)
(Jack, Sally, 4)
(David, Lisa, 4)
(Jesse, Kevin, 4)

在我们到达第 4 周之前,一切似乎都很好。我们应该每周看到 6 对(我的阵列有 12 人)。进行了一些挖掘,它似乎被卡住了,因为剩余的对无效并被移除。

任何帮助表示赞赏。

编辑

我让我的生活变得更加艰难。我只是使用了循环算法

4

0 回答 0