Дано:
- Набор цветных карандашей уникального цвета (размера x).
- Набор дочерних элементов.
- Все мелки должны быть назначены children.
- У ребенка может быть от нуля до x мелков.
- У каждого мелка должен быть ровно 1 ребенок. Карандаш не может быть назначен двум или более детям.
Как мне go найти все возможные комбинации назначений?
Например:
class Crayon {
String color;
public Crayon(String color) {
this.color = color;
}
public String getColor() {
return color;
}
@Override
public String toString() {
return color;
}
}
class Child {
String name;
Set<Crayon> crayons;
public Child(String name) {
this.name = name;
crayons = new HashSet<Crayon>();
}
public void addCrayon(Crayon crayon) {
crayons.add(crayon);
}
public Set<Crayon> getCrayons() {
return crayons;
}
@Override
public String toString() {
return "Child [name=" + name + ", crayons=" + crayons + "]";
}
}
public class DistributeCrayons {
public static void main(String[] args) {
Set<Crayon> crayons = new HashSet<>();
crayons.add(new Crayon("red"));
crayons.add(new Crayon("blue"));
crayons.add(new Crayon("green"));
crayons.add(new Crayon("orange"));
crayons.add(new Crayon("brown"));
crayons.add(new Crayon("yellow"));
crayons.add(new Crayon("purple"));
Child bob = new Child("bob");
Child amy = new Child("amy");
Child tom = new Child("tom");
for(??) {
for(??) {
??
System.out.println(bob +" "+ amy +" "+ tom);
??
}
}
}
}
Это должно вывести все возможные комбинации назначений, например:
Child [имя = боб, мелки = [зеленый, синий]] Child [имя = Эми, мелки = [коричневый, красный]] Child [имя = Том, карандаши = [желтый, фиолетовый, оранжевый]]
Ребенок [имя = Боб, карандаши = []] Ребенок [имя = Эми, карандаши = [коричневый, красный, синий]] Ребенок [имя = Том , мелки = [желтый, фиолетовый, оранжевый, зеленый]]
ребенок [имя = боб, мелки = [красный]] ребенок [имя = ами, мелки = [коричневый, зеленый, фиолетовый, оранжевый]] ребенок [имя = том, мелки = [синий, желтый]]
и c.
ОБНОВЛЕНИЕ
Спасибо всем за ценные отзывы и גלעד ברקן за предоставление рабочего js решения. (извините, я не могу ответить или принять ответ из-за подсчета репутации).
Теперь я могу обернуть голову, вот моя версия решения:
I преобразовал мелки и детей в списки вместо наборов. Для списка из 7 мелков (красного, синего, зеленого, оранжевого, коричневого, желтого, фиолетового) я стремлюсь создать все задания для трех детей: боб (id = "b"), amy (id = "a ") и том (id =" t ") в форме 7-символьных слов. Например: слово типа" tbbbtat "означает, что Том получает красный, коричневый и фиолетовый карандаши, Боб получает синий, зеленый и оранжевые карандаши, а Эми получает желтый.
public class DistributeCrayons {
public static void main(String[] args) {
List<Crayon> crayons = new ArrayList<>();
crayons.add(new Crayon("red"));
crayons.add(new Crayon("blue"));
crayons.add(new Crayon("green"));
crayons.add(new Crayon("orange"));
crayons.add(new Crayon("brown"));
crayons.add(new Crayon("yellow"));
crayons.add(new Crayon("purple"));
List<Child> children = new ArrayList<>();
children.add(new Child("b"));
children.add(new Child("a"));
children.add(new Child("t"));
List<String> assignments = null;
for(int i = 0; i < crayons.size(); i++)
assignments = addCrayonCombos(assignments, children);
System.out.println(assignments);
}
static List<String> addCrayonCombos(List<String> assignments, List<Child> children) {
if(assignments == null) {
assignments = new ArrayList<String>();
for(Child c: children)
assignments.add(c.getId());
return assignments;
} else {
List<String> updatedAssignments = new ArrayList<String>();
for(String assignment: assignments) {
for(Child c: children)
//append next permutations for a new crayon to existing "words"
updatedAssignments.add(assignment+c.getId());
}
return updatedAssignments;
}
}
}
Это генерирует ожидаемый список слов назначения (точнее 2187 слов), так как у нас есть 3 возможности для каждого из 7 карандашей (т.е. 3 ^ 7 = 2187).