我正在编写一个程序,可以为随机数量的表(可以达到1000 +)计算所有可能的位置:
正如您在图像上看到的那样,黑点代表人(但在计算机中,有不同类型的人。) 表有两种类型:蓝色和粉红色。蓝色的可以包含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(是列表)
答案 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是表格的数量。
您可以使用循环执行此操作,但您也可以递归执行此操作。有算法可以在那里使用。例如: