可能性和嵌套的foreach循环C#

时间:2013-09-04 11:22:37

标签: c# foreach

我正在编写一个程序,可以为随机数量的表(可以达到1000 +)计算所有可能的位置:

enter image description here

正如您在图像上看到的那样,黑点代表人(但在计算机中,有不同类型的人。) 表有两种类型:蓝色和粉红色。蓝色的可以包含3个人,粉红色的2个人。

为了让任何人都可以坐下来,我可以使用foreach循环(其中8个)然后我可以运行一些额外的代码......

但是如果我添加200个表会怎么样?那我需要使用200个foreach循环吗? 有没有什么方法可以更快地编码和更少空间消耗编码?

我尝试了什么? =>

  switch(listoftables.Count)
  {
      case 1:foreach(Table table in listoftables){ //code to add people to this table}break;
      case 2: foreach(Table table1 in listoftables)
      {foreach(Table table1 in       listoftables){//code to add people to this table
   }}break;
   }

INPUT:包含可编辑Table类对象的数组(由我自己创建的类) PROCESS:上面的List被编辑并被添加到另一个List对象,在整个foreach过程结束后,OUTPUT会将所有可能的配置(谁在另一个List对象中)写入屏幕。

输出的示例部分:

  // List<Table> listofalltables was processed
  List<listofalltables> output 

=&GT;在数组中包含[0]:列表第一个  =&GT;在数组中包含[0]:Table.attachedpeople(是列表)

3 个答案:

答案 0 :(得分:0)

尝试递归方法。一个小例子:

public List<Table> assignToTable(List<Person> invited, List<Table> tables)
{
    if(!tables.HasRoom)
         return tables;
     else
     {
         assign(tables,invited) //code to add a person to a table
         assignToTable(invited, tables);
     }
}

如果我是你,我会创建一个对象,代表你有一个属性的表,知道是否还有一些房间可用。这将为每个人分配一张没有任何foreach的桌子。 然后在你的主要你可以有一个方法,将尽可能重新排列表: 表格1 表2 表3

然后

表1 表3 表2 ...

表3 表2 表1

并在这些列表上调用递归方法,你将拥有人们可以坐的所有可能性......

答案 1 :(得分:0)

采取@Guigui的回答并将其改为我如何解释这个问题。通过递归和循环,这将尝试将每个人放在所有地方(除非有比椅子更多的人,这是一个案例?我假设更多的椅子而不是人),因为你看到复杂性将是O(Math.Power(nrPeople, nrSeats))形式是很多(如果我没有记错的话)。

Person[] peopleInvited = ....; // Avoid copying this, we are not modifying it
public void AssignToTable(int invited, SeatingArrangements tables)
{
  if(!tables.HasRoom || invited == peopleInvited.Length)
    // Do what? Print the seating?
  else
  {
    var personToSeat = peopleInvited[invited];
    foreach (var possibleSeating in tables.GetEmptyChairs()) 
    {
      // Add one person to a table somewhere, but don't modify tables
      var newArrangments = Assign(possibleSeating, personToSeat, tables) 
      AssignToTable(invited + 1, newArrangements);
    }
  }
}

答案 2 :(得分:0)

嗯,这更像是关于数学而不是编程的问题。你要做的是创建permutations人。基本上你有N个桌子和2N + 2个座位。您可以为每个座位分配一个号码。然后结果将是2N + 2的K-排列集合,其中K是被邀请的人数,N是表格的数量。

您可以使用循环执行此操作,但您也可以递归执行此操作。有算法可以在那里使用。例如:

Algorithm to generate all possible permutations of a list?